Проблемы с разрешением Oracle SID через поиск LDAP / OID с помощью тонкого клиента JDBC

Мы используем поиск OID / LDAP для нашей конфигурации подключения. И переменная среды TNS_ADMIN, и свойство oracle.net.tns_admin Java установлены правильно и указывают на каталог, содержащий sqlnet.ora и ldap.ora. Однако URL-адрес подключения JDBC: jdbc:oracle:thin:@ourtnsalias выдает исключение при попытке подключения:

java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier  "ourtnsalias"
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at TnsTest.main(TnsTest.java:29)
Caused by: oracle.net.ns.NetException: could not resolve the connect identifier  "tnsalias"
        at oracle.net.resolver.NameResolver.resolveName(NameResolver.java:181)
        at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:416)
        at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:687)
        at oracle.net.ns.NSProtocol.connect(NSProtocol.java:247)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)
        ... 7 more
Exception in thread "main" java.lang.NullPointerException
        at TnsTest.main(TnsTest.java:46)

Следующие разновидности строки подключения успешно подключаются:

  • Полная строка TNS:
    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.company.com)(PORT=####))(CONNECT_DATA=(SERVICE_NAME=service_name)))
  • Полный URL-адрес LDAP:
    jdbc:oracle:thin:@ldap://oid.company.net:####/ourtnsname,CN=OracleContext,dc=company,dc=net

Это может означать, что проблема связана с поиском LDAP / OID. Однако запущенный tnsping ourtnsname также успешно подключается.

Есть ли способ использовать только псевдоним TNS в строке подключения при поиске OID / LDAP?

Для полноты картины вот соответствующая Java:

String connectionURL = "jdbc:oracle:thin:@ourtnsalias";
System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin");
Class.forName("oracle.jdbc.OracleDriver");
Connection c = DriverManager.getConnection(connectionURL, userid, password);

person jasonkarns    schedule 25.05.2012    source источник
comment
У меня точно такая же проблема - у нас есть 2 сервера, настроенные почти одинаково, один работает, а другой возвращает ошибку, даже если tnsping и т. Д. Работает нормально. Вы когда-нибудь находили разрешение?   -  person Bittercoder    schedule 09.10.2012


Ответы (3)


После того, как я ударился головой об стену, выяснилось, что проблема для нас заключалась в том, что в записи TNS Names были недопустимые табуляции / интервалы между несколькими строками, из-за чего она не обрабатывалась правильно.

В нашем случае неожиданно оказалось, что TNSPING смог правильно проанализировать файл TNSNAMES.Ora, а драйвер jdbc Oracle - нет.

Удаление всего интервала в записи TNSNAmes, а затем осторожное добавление его обратно, обращая внимание на правила, описанные здесь:

http://docs.oracle.com/cd/A57673_01/DOC/net/doc/NWUS233/apb.htm

Помогли нам решить вопрос.

Что привело нас к ответу, так это то, что мы получим другую ошибку при изменении идентификатора соединения, то есть при переключении с этого:

jdbc:oracle:thin:@ourtnsalias

To:

jdbc:oracle:thin:@unknown

Выдавал другую ошибку (наряду с проверкой монитора процесса sysinternals, чтобы убедиться, что файл TNSNAmes.ora действительно читается), предположил, что он анализирует файл TNS, но что-то не так с записью, которая сбивает с толку.

Я не могу не думать, что все это можно было бы легко решить, если бы клиент JDBC Oracle возвратил более значимую ошибку, т.е. «невозможно проанализировать запись TNS для идентификатора соединения»!

Надеюсь, это поможет кому-то другому :)

person Bittercoder    schedule 24.10.2012
comment
Спасибо...! Исправлена ​​моя проблема. Был пробел в конце файла. - person John Engelhart; 16.02.2016

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

System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin"); 

должно быть

System.setProperty("oracle.net.tns_admin", "c://oracle//network//admin"); 

or

System.setProperty("oracle.net.tns_admin", "c:\\oracle\\network\\admin");
person jay    schedule 05.06.2012
comment
Протестировано с обоими вкусами, результат одинаковый. - person jasonkarns; 11.06.2012

Найдите недопустимые символы в вашем tnsnames.ora.

я имел

test, test.WORLD=...

в моем файле. Изменив его на

test.WORLD=

решил вопрос.

person SJones    schedule 25.02.2016