web-dev-qa-db-fra.com

Java JDBC - Comment se connecter à Oracle en utilisant Nom du service au lieu de SID

J'ai une application Java qui utilise JDBC (via JPA) et qui se connectait à une base de développement en utilisant hostname, port et Oracle SID, comme ceci:

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

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

J'ai essayé ça 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?

215
Jim Tough

http://download.Oracle.com/docs/cd/B28359_01/Java.111/b31224/urls.htm#BEIDHCBA

Syntaxe de nom de service de style fin

Les noms de service de style fin ne sont pris en charge que 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/nom_serveur

Donc j'essayerais:

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 suit:

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)))
379
Bert F

Donc, il y a deux façons faciles de faire ce travail. 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

Toutefois, si vous devez fournir d'autres propriétés de connexion spécifiques à Oracle, vous devez utiliser le style TNSNAMES long. Je devais le faire récemment pour activer les connexions partagées Oracle (où le serveur effectue son propre regroupement 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 paraître familier. Si ce n'est pas le cas, cherchez simplement Google dans les détails.

84
Jim Tough

Vous pouvez également spécifier le nom TNS dans l'URL JDBC comme indiqué 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)))
23
Robert Greathouse

Essayez ceci: jdbc:Oracle:thin:@Oracle.hostserver2.mydomain.ca:1522/ABCD

Edit: par commentaire ci-dessous, cela est en fait correct: jdbc:Oracle:thin:@//Oracle.hostserver2.mydomain.ca:1522/ABCD (notez le //)

Voici un lien vers un article utile

13
DwB

Cette discussion m'a aidé à résoudre le problème avec lequel je me débattais pendant des jours. J'ai regardé partout sur Internet jusqu'à ce que j'ai trouvé la réponse de Jim Tough le 18 mai 2011 à 15h17. 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);
        }       
    }
}
6
Ed Chipeta

Si vous utilisez Eclipse pour connecter Oracle sans SID. Il existe deux pilotes pour sélectionner le pilote léger Oracle et l’autre pilote. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne de la base de données. Maintenant, vous pouvez vous connecter directement en utilisant le nom du service sans SID.

1

Lorsque vous utilisez dag au lieu de thin, la syntaxe ci-dessous indiquant le nom du service a fonctionné pour moi. Les solutions jdbc:thin ci-dessus ne fonctionnaient pas.

jdbc:dag:Oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
0
Syk Nar

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

0
Kamesh Murali