291 votes

Comment se connecter à Oracle en utilisant le nom du service au lieu du SID ?

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

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

XYZ était le SID d'Oracle. Je dois maintenant me connecter à une autre base de données Oracle qui n'utilise pas de SID, mais 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 de mal ?

490voto

Bert F Points 27237

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

Syntaxe du nom du service de style fin

Les noms de service de style Thin sont pris en charge uniquement par le pilote JDBC Thin. La syntaxe est la suivante :

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

Par exemple :

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

Alors j'essaierais :

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

De plus, 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)))

0 votes

Pouvez-vous intégrer le point sur le format TNSNAMES par réponse de @Robert Greathouse pour atteindre la perfection de la réponse ?

0 votes

Pour moi, cela n'a pas fonctionné 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.

1 votes

J'ai essayé de comprendre comment se connecter à Oracle en utilisant le pilote léger JDBC sur Google App script et j'ai essayé un certain nombre de syntaxes sans succès. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAME o jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME avec le nom d'utilisateur et le mot de passe comme arguments pour jdbc.getConnection() . Toujours aussi déroutant.

110voto

Jim Tough Points 4623

Il y a donc deux façons simples de faire fonctionner ce système. La solution posté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 le suivant :

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

Toutefois, 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 sa propre mise en commun des connexions). Le format TNS est le suivant :

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 TNSNAMES d'Oracle, cela devrait vous sembler familier. Si ce n'est pas le cas, il suffit de le rechercher sur Google pour obtenir des détails.

25voto

Robert Greathouse Points 370

Vous pouvez aussi spécifier le nom du 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)))

22voto

DwB Points 14687

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

Edit : selon le commentaire ci-dessous, c'est en fait correct : jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (notez le // )

Voici un lien à un article utile

3 votes

Cela n'a pas fonctionné pour moi, j'ai dû utiliser jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD .

0 votes

L'IP peut donc être utilisé ici au lieu de oracle.hostserver2.mydomain.ca ?

10voto

Ed Chipeta Points 81

Cette discussion m'a permis de résoudre le problème avec lequel je me débattais depuis des jours. J'ai cherché partout sur Internet jusqu'à ce que je trouve la réponse de Jim Tough le 18 mai 11 à 15:17. Grâce à cette réponse, j'ai pu me connecter. Maintenant, je veux donner en retour et aider les autres avec un exemple complet. C'est parti :

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);
        }       
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X