Java JDBC - comment se connecter à Oracle en utilisant le nom du Service au lieu de SID

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

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

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

J'ai essayé ceci mais ce n'est pas le cas travail:

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?

203
demandé sur Jim Tough 2011-01-28 22:05:24

7 réponses

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

syntaxe de nom de Service de style mince

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

@ / / host_name: port_number / service_name

Par exemple:

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

Donc je voudrais essayez:

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

Aussi, 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)))
356
répondu Bert F 2018-02-19 05:43:31

Il y a donc deux façons simples de faire ce travail. La solution publiée par Bert F fonctionne correctement 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. 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 êtes familier avec le format de fichier Oracle TNSNAMES, alors cela devrait vous sembler familier. Sinon, il suffit de Google pour les détails.

81
répondu Jim Tough 2018-05-16 12:52:43

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)))
21
répondu Robert Greathouse 2013-10-31 08:52:12

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

Edit: par commentaire ci-dessous Ceci est réellement correct: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (notez le //)

Voici un lien pour un article utile

12
répondu DwB 2018-03-29 08:05:56

Cette discussion m'a aidé à résoudre le problème avec lequel je luttais pendant des jours. J'ai regardé partout sur internet jusqu'à ce que je trouve la réponse de Jim Tough le mai 18 '11 à 15:17. Avec cette réponse, j'ai été en mesure de se 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
répondu Ed Chipeta 2015-10-19 11:15:48

Dans le cas où vous utilisez eclipse pour connecter oracle sans SID. Il y a deux conducteurs de choisir c'est à dire, Oracle mince conducteur et l'autre est l'autre conducteur. Sélectionnez d'autres pilotes et entrez le nom du service dans la colonne base de données. Maintenant, vous pouvez vous connecter directement en utilisant le nom du service sans SID.

1
répondu Bhagavathy Vinoth 2016-05-24 12:12:23

Lorsque vous utilisez dag au lieu de thin, la syntaxe ci-dessous pointant vers le nom du service a fonctionné pour moi. Les solutions jdbc:thin ci-dessus n'ont pas fonctionné.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
0
répondu Syk Nar 2018-07-28 00:10:01