web-dev-qa-db-fra.com

Java JDBC - Comment se connecter à Oracle en utilisant tnsnames.ora

Le fichier tnsnames.ora Contient le Databases et leur description (Host + port).

  • Est-il possible d'établir une connexion en s'appuyant sur le fichier mentionné ci-dessus? (Dites en fournissant uniquement le nom de la base de données):

  • Pour trouver ce fichier, je dois connaître le répertoire Oracle par défaut dont j'ai besoin pour vérifier dans le registre Windows HKEY_LOCAL_MACHINE\Software\Oracle, Puis pour avoir tous les fichiers KEY_XXX, Puis vérifier lequel apparaît en premier. sur le %PATH%. Existe-t-il un moyen de rechercher automatiquement ce fichier sur l'ordinateur client?

14
Maroun

Je ne savais même pas que l'utilisation de tnsnames avec le pilote léger est possible, mais apparemment, il a été ajouté quelque part dans la version 10:

http://docs.Oracle.com/cd/B19306_01/Java.102/b14355/urls.htm#BEIDIJCE

En particulier:

Remarque:

Lorsque vous utilisez TNSNames avec le pilote JDBC Thin, vous devez définir la propriété Oracle.net.tns_admin sur le répertoire qui contient votre fichier tnsnames.ora.

Java -Doracle.net.tns_admin=%Oracle_HOME%\network\admin

Comme mentionné, je n'ai pas vérifié si cela fonctionne réellement .

Je ne pense pas que la logique "trouver le répertoire de configuration réseau réel" soit disponible via une fonction Oracle. Vous devrez le faire manuellement comme indiqué dans votre question, ou peut-être compter sur la variable d'environnement TNS_ADMIN étant présente. Dans ce cas, l'invocation Java serait

Java -Doracle.net.tns_admin=%TNS_ADMIN%
20
Chris

Eh bien, dans certaines interfaces graphiques, la configuration du pilote TNS n'est tout simplement pas implémentée ou ne fonctionne pas (NetBeans par exemple :-))

https://netbeans.org/bugzilla/show_bug.cgi?id=231526

Il existe une solution simple ici. Vous pouvez prendre l'entrée directement à partir du fichier tnsnames.ora et la joindre à la chaîne de pilote jdbc comme suit:

Exemple d'utilisation d'odbc7.jar (pilote JDBC Oracle 12c pour JDK 7) pour se connecter au cluster Oracle 11gR2 RAC:

jdbc: Oracle: thin: @ (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host = hostA) (PORT = 1522)) (ADDRESS = (PROTOCOL = TCP) (Host = hostB) (PORT = 1521) )) (SOURCE_ROUTE = oui) (CONNECT_DATA = (SERVICE_NAME = DatabaseService))))

Soyez conscient de mettre les caractères double :: à la fin en tant que Host: port: service, si vous mettez :: à la fin comme ceci:

jdbc: Oracle: thin: @ (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host = hostA) (PORT = 1522)) (ADDRESS = (PROTOCOL = TCP) (Host = hostB) (PORT = 1521) )) (SOURCE_ROUTE = oui) (CONNECT_DATA = (SERVICE_NAME = DatabaseService))) ::

Vous vous retrouverez avec l'exception "NL exception a été générée".

Une autre approche consiste à configurer la propriété suivante: System.setProperty ("Oracle.net.tns_admin", "C: /app/product/11.2.0/client_1/NETWORK/ADMIN");

Bien sûr, au lieu d'une valeur codée en dur, vous pouvez par exemple configurer une variable d'environnement dans votre système d'exploitation comme Oracle_TNS_ADMIN puis la référencer:

System.setProperty("Oracle.net.tns_admin",System.getenv("Oracle_TNS_ADMIN"));

ou passez-le à Java processus via le commutateur -D sur linux:

-Doracle.net.tns_admin=$Oracle_TNS_ADMIN

et fenêtres: comme

-Doracle.net.tns_admin=%Oracle_TNS_ADMIN%

Une fois que notre application connaît le fichier de configuration TNS, nous pouvons nous connecter par nom de service de référence dans le fichier TNSNAMES.ora comme dans cet exemple complet:

 // tell the driver where to look for the TNSNAMES.ORA file
System.setProperty(
          "Oracle.net.tns_admin",
          "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");

// ORCL is net service name from the TNSNAMES.ORA file
String dbURL = "jdbc:Oracle:thin:@ORCL";

// load the driver
Class.forName("Oracle.jdbc.OracleDriver");

Connection conn = null;
Statement stmt = null;

try {
  conn = DriverManager.getConnection(dbURL,
                                     "your_username",
                                     "your_password");

  stmt = conn.createStatement();

  ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");
13
kensai

Assurez-vous d'abord que le logiciel SQL Developer est correctement installé sur votre machine. Si vous utilisez un pilote léger, assurez-vous que votre fichier ojdbcX.jar se trouve dans votre chemin de génération. Les étapes pour se connecter à la source de données Oracle à l'aide du nom d'alias TNS sont les suivantes:

  • Définissez la propriété système pour Oracle.net.tns_admin. Cela devrait pointer vers le répertoire contenant votre fichier tnsnames.ORA

    System.setProperty("Oracle.net.tns_admin", DIRECTORY_PATH_TO_TNSNAME.ORA_FILE);

  • Enregistrer un pilote Oracle

    DriverManager.registerDriver (nouveau OracleDriver ());

  • Créer un objet de connexion

    Connection conn = DriverManager.getConnection("jdbc:Oracle:thin:username/password@TNS_ALIAS_NAME");

Cela devrait établir la connexion à la base de données.

2