Java JDBC - Comment se connecter à Oracle en utilisant le nom de 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 le SID Oracle. Maintenant, je dois me connecter à une autre base de données Oracle qui n'utilise pas de SID, mais utilise un "nom de service" Oracle à la place.

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

Author: Jim Tough, 2011-01-28

7 answers

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 type Thin ne sont pris en charge que 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

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

Il y a donc deux façons faciles 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 ê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
Author: 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
Author: 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
Author: DwB, 2018-03-29 08:05:56

Cette discussion m'a aidé à résoudre le problème avec lequel je luttais 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 é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
Author: Ed Chipeta, 2015-10-19 11:15:48

Au cas où vous utiliseriez eclipse pour connecter oracle sans SID. Il y a deux pilotes à sélectionner, c'est-à-dire Oracle thin driver et other is other driver. Sélectionnez autres pilotes et entrez le nom du service dans la colonne base de données. Vous pouvez maintenant vous connecter directement en utilisant le nom du service sans SID.

 1
Author: Bhagavathy Vinoth, 2016-05-24 12:12:23

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

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