Подтвердить что ты не робот

Java JDBC - Как подключиться к Oracle с помощью tnsnames.ora

tnsnames.ora файл содержит Databases и их описание (host + port).

  • Возможно ли установить соединение, основанное на файле, упомянутом выше? (Скажем, предоставляя только имя БД):

  • Чтобы найти этот файл, я должен знать дом по умолчанию для oracle. Мне нужно проверить реестр Windows на HKEY_LOCAL_MACHINE\Software\Oracle, а затем получить все файлы KEY_XXX, а затем проверить, какой из них отображается первым на %PATH%. Есть ли способ автоматически найти этот файл на клиентском компьютере?

4b9b3361

Ответ 1

Я даже не знал, что использование tnsnames с тонким драйвером возможно, но, видимо, оно было добавлено где-то в версии 10:

http://docs.oracle.com/cd/B19306_01/java.102/b14355/urls.htm#BEIDIJCE

В частности:

Note:

При использовании TNSNames с тонким драйвером JDBC необходимо установить для свойства oracle.net.tns_admin каталог, в котором находится файл tnsnames.ora.

java -Doracle.net.tns_admin=%ORACLE_HOME%\network\admin

Как уже упоминалось, я не проверял, действительно ли это работает.

Я не думаю, что логика "найти актуальный каталог конфигурации сети" доступна через какую-то функцию Oracle. Вам придется сделать это вручную, как указано в вашем вопросе, или, возможно, полагаться на наличие переменной среды TNS_ADMIN. В этом случае вызов Java будет

java -Doracle.net.tns_admin=%TNS_ADMIN%

Ответ 2

Что ж, в некоторых графических интерфейсах конфигурация драйвера TNS просто не реализована или не работает (например, NetBeans :-))

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

Здесь есть простой обходной путь. Вы можете взять запись непосредственно из файла tnsnames.ora и прикрепить ее к строке драйвера jdbc следующим образом:

Пример использования odbc7.jar (драйвер JDBC Oracle 12c для JDK 7) для подключиться к кластеру 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=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))

Помните, что в конце необходимо указывать в конце символы double :: как host: port: service, если вы поставите :: в конце следующим образом:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=hostA)(PORT= 1522))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT=1521)))(SOURCE_ROUTE=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))::

Вы получите исключение "NL Exception Генерировано".

Другой подход заключается в настройке следующего свойства:   System.setProperty( "oracle.net.tns_admin", "C: /app/product/11.2.0/client_1/NETWORK/ADMIN");

Конечно, вместо жестко заданного значения вы можете, например, установить переменную среды в вашей операционной системе, например ORACLE_TNS_ADMIN, и затем ссылаться на нее:

System.setProperty("oracle.net.tns_admin",System.getenv("ORACLE_TNS_ADMIN"));

или передайте его процессу Java через переключатель -D в Linux:

-Doracle.net.tns_admin=$ORACLE_TNS_ADMIN

и окна: как

-Doracle.net.tns_admin=%ORACLE_TNS_ADMIN%

Как только наше приложение узнает о файле конфигурации TNS, мы можем подключиться по справочному имени службы в файле TNSNAMES.ora, как в этом полном примере:

 // 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");

Ответ 3

Во-первых, убедитесь, что программное обеспечение SQL Developer правильно установлено на вашем компьютере. Если вы используете тонкий драйвер, убедитесь, что ваш файл ojdbcX.jar находится в вашем пути сборки. Шаги для подключения к источнику данных Oracle с использованием имени псевдонима TNS:

  • Задайте системное свойство для oracle.net.tns_admin. Это должно указывать на каталог с файлом tnsnames.ORA

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

  • Зарегистрируйте драйвер Oracle

    DriverManager.registerDriver(новый OracleDriver());

  • Создайте объект подключения

    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:username/[email protected]_ALIAS_NAME");

Это должно установить соединение с базой данных.

Ответ 4

Начиная с 18.3, TNS_ADMIN, который предоставляет расположение файла tnsnames.ora, может передаваться как часть URL-адреса соединения. Пожалуйста, обратите внимание на синтаксис.

jdbc:oracle:thin:@jdbctest_medium?TNS_ADMIN=/test/cloud/network

Ответ 5

Вы также можете попробовать следующее

Попробуйте, после нескольких часов устранения неполадок наткнулся на образец, который я модифицировал, и он работает как драгоценный камень.

jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)(port=1521)(host=19.16.200.12)) (address=(protocol=tcp)(port=1521)(host=19.16.200.10)))(load_balance = yes)(connect_data=(SERVICE_NAME=stackdb)))

Ниже приведен пример без баланса нагрузки:

jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)
(port=1521)(host=prodHost)))(connect_data=(INSTANCE_NAME=ORCL)))

Вот URL, который помог https://docs.oracle.com/cd/E11882_01/java.112/e16548/jdbcthin.htm#JJDBC28202