Java JDBC - Как подключиться к Oracle с помощью tnsnames.ora
tnsnames.ora
файл содержит Databases
и их описание (host
+ port
).
-
Возможно ли установить соединение, основанное на файле, упомянутом выше? (Скажем, предоставляя только имя БД):
-
Чтобы найти этот файл, я должен знать дом по умолчанию для oracle. Мне нужно проверить реестр Windows на HKEY_LOCAL_MACHINE\Software\Oracle
, а затем получить все файлы KEY_XXX
, а затем проверить, какой из них отображается первым на %PATH%
. Есть ли способ автоматически найти этот файл на клиентском компьютере?
Ответы
Ответ 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