Java JDBC - Comment se connecter à Oracle en utilisant le nom du service au lieu du SID

251

J'ai une application Java qui utilise JDBC (via JPA) qui se connectait à une base de données de développement en utilisant le nom d'hôte, le port et Oracle SID, comme ceci:

jdbc: oracle: thin: @ oracle.hostserver1.mydomain.ca: 1521: XYZ

XYZ était Oracle SID. Maintenant, je dois me connecter à une autre base de données Oracle qui n'utilise pas de SID, mais utilise à la place un "nom de service" Oracle.

J'ai essayé mais ça ne marche pas:

jdbc: oracle: thin: @ oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD est le nom de service de l'autre base de données.

Qu'est-ce que je fais mal?

Jim Tough
la source

Réponses:

427

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

Syntaxe de nom de service de style léger

Les noms de service de style léger ne sont pris en charge que par le pilote JDBC Thin. La syntaxe est:

@ // nom_hôte: numéro_port / nom_service

Par exemple:

jdbc: oracle: thin: scott / tiger @ // myhost: 1521 / myservicename

J'essaierais donc:

jdbc: oracle: thin: @ // oracle.hostserver2.mydomain.ca:1522/ABCD

En outre, selon la réponse de Robert Greathouse, vous pouvez également spécifier le nom TNS dans l'URL JDBC comme ci-dessous:

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))
Bert F
la source
Pouvez-vous intégrer le point sur le format TNSNAMES par réponse de @Robert Greathouse pour atteindre la perfection de réponse?
Alister Lee
Pour moi, cela ne fonctionnait pas avec le @, j'ai dû utiliser jdbc: oracle: thin: // myhost: 1521 / myservicename, mais je n'ai pas non plus fourni les informations d'identification de l'utilisateur
Daniel
J'ai essayé de comprendre comment se connecter à Oracle à l'aide du pilote léger JDBC sur Google App Script et j'ai essayé un certain nombre de syntaxe sans succès. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEou jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, avec le nom d'utilisateur et le mot de passe comme arguments pour jdbc.getConnection(). Toujours déroutant.
Benjamin
92

Il y a donc deux façons simples de faire fonctionner cela. La solution publiée par Bert F fonctionne bien si vous n'avez pas besoin de fournir d'autres propriétés de connexion spécifiques à Oracle. Le format pour cela est:

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

Cependant, si vous devez fournir d'autres propriétés de connexion spécifiques à Oracle, vous devez utiliser le style long TNSNAMES. J'ai dû le faire récemment pour activer les connexions partagées Oracle (où le serveur fait son propre pool de connexions). Le format TNS est:

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

Si vous connaissez le format de fichier Oracle TNSNAMES, cela devrait vous être familier. Si ce n'est pas le cas, il suffit de le rechercher sur Google pour les détails.

Jim Tough
la source
24

Vous pouvez également spécifier le nom TNS dans l'URL JDBC comme ci-dessous

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))
Robert Greathouse
la source
17

Essaye ça: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Modifier: par commentaire ci-dessous, c'est vraiment correct: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(notez le //)

Voici un lien vers un article utile

DwB
la source
3
Cela ne fonctionnait pas pour moi, je devais l'utiliser jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
L'IP peut donc être utilisé ici au lieu de oracle.hostserver2.mydomain.ca?
Benjamin
8

Cette discussion m'a aidé à résoudre le problème avec lequel je me débattais depuis des jours. J'ai regardé partout sur Internet jusqu'à ce que je trouve la réponse de Jim Tough le 18 mai 11 à 15:17. Avec cette réponse, j'ai pu me connecter. Maintenant, je veux redonner et aider les autres avec un exemple complet. Voici:

import java.sql.*; 

public class MyDBConnect {

    public static void main(String[] args) throws SQLException {

        try { 
            String dbURL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=whatEverYourHostNameIs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=yourServiceName)))";
            String strUserID = "yourUserId";
            String strPassword = "yourPassword";
            Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword);

            Statement sqlStatement = myConnection.createStatement();
            String readRecordSQL = "select * from sa_work_order where WORK_ORDER_NO = '1503090' ";  
            ResultSet myResultSet = sqlStatement.executeQuery(readRecordSQL);
            while (myResultSet.next()) {
                System.out.println("Record values: " + myResultSet.getString("WORK_ORDER_NO"));
            }
            myResultSet.close();
            myConnection.close();

        } catch (Exception e) {
            System.out.println(e);
        }       
    }
}
Ed Chipeta
la source
1

Dans le cas où vous utilisez eclipse pour connecter oracle sans SID. Il y a deux pilotes à sélectionner, à savoir le pilote léger Oracle et l'autre est un autre pilote. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne de la base de données. Vous pouvez maintenant vous connecter directement en utilisant le nom du service sans SID.

Bhagavathy Vinoth
la source
Plus important encore, cela vous permet de spécifier complètement l'URL de connexion contrairement au pilote léger. Le plus drôle est que vous devez toujours utiliser l'URL du pilote léger pour le faire fonctionner (les noms de service de style léger ne sont pris en charge que par le pilote léger JDBC). Beaucoup d'exemples affichés ici.
Edi Bice
0

Lors de l'utilisation dagau lieu de thin, la syntaxe ci-dessous pointant vers le nom du service a fonctionné pour moi. Les jdbc:thinsolutions ci-dessus n'ont pas fonctionné.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
la source
1
Veuillez envisager d'ajouter plus d'informations à votre réponse décrivant un peu plus ce qui a fonctionné / n'a pas fonctionné - qu'avez-vous observé ou savez-vous pourquoi cela fonctionne?
AJD
1
Il convient de noter que vous utilisez un pilote spécifique. La tentative d'utilisation du pilote léger d'Oracle renvoie: Aucun pilote approprié trouvé pour jdbc: dag: oracle: //
access_granted
0

Cela devrait fonctionner: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

Kamesh Murali
la source
1
Erreur: "URL Oracle spécifiée non valide", combinaison 11g / ojdbc7.
access_granted