Получаем ORA-12514, но мы можем подключиться через SQLPlus

#oracle #jdbc #sqlplus

Вопрос:

Мы внезапно получаем ошибку ORA-12514, TNS:listener does not currently know of service requested in connect descriptor в нашем приложении.

Поиск в Google, по-видимому, подсказывает пару простых решений (например, найденных здесь), но они не работают для нас.

Самое странное, что:

  • Мы можем подключиться по SSH к серверу, на котором запущено наше приложение, и..
  • мы можем подключиться к SQLPlus на этом сервере,..
  • используя те же параметры подключения JDBC, что и приложение (мы можем получить их из журнала во время запуска приложения, поэтому мы уверены, что они совпадают).

Почему мы можем подключиться к базе данных с помощью SQLPlus, но наше приложение не может этого сделать?

Вот два метода подключения (JDBC и SQLPlus), оба последовательно анонимизированы:

интерфейс jdbc

 {
jdbcDriver=oracle.jdbc.OracleDriver,
jdbcUser=THE_USER,
jdbcPassword=THE_PASSWORD,
configurationVersion=1.0.14,
jdbcURL=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=THE_HOST)(Port=THE_PORT))(CONNECT_DATA=(SERVICE_NAME=THE_SERVICE_NAME)))
}
 

SQLPlus

 sqlplus THE_USER/'THE_PASSWORD@'"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=THE_HOST)(Port=THE_PORT))(CONNECT_DATA=(SERVICE_NAME=THE_SERVICE_NAME)))"
 

Комментарии:

1. «используя те же самые параметры подключения JDBC» — SQL*Plus не использует JDBC. Вы имеете в виду, что используете Easy Connect; или вы предоставляете псевдоним TNS (@name или через TWO_TASK), и этот псевдоним определен с теми же значениями? Пожалуйста, отредактируйте свой вопрос, чтобы точно показать, как вы подключаетесь в обоих случаях, и что lsnrctl services отображается на сервере — предпочтительно реальные значения, но если вам нужно изменить значения для безопасности, пожалуйста, убедитесь, что вы делаете это последовательно.

2. @Alexpool, я добавил два анонимных соединения.

3. Хорошо; предполагая, что вы постоянно анонимизируетесь, и у вас не просто опечатка в одном из ваших реальных значений, если the_host это имя, соответствует ли оно одному и тому же IP-адресу в обоих местах, и является ли это тот же хост/IP, на который вы входили по ssh?

4. @Alexpool — the_host это имя хоста. Я не могу сказать, как это решается из кода java, но я бы предположил, что он делает это правильно (т. Е. Так же, как из строки cmd), иначе я ожидал бы другой ошибки. Мы не можем подключиться по SSH к этому (серверу БД), только к серверу приложений (который отличается).

5. Что говорится в журнале прослушивателя о запросе на подключение JDBC — вы должны иметь возможность видеть, какую службу он запрашивает (и действительно ли она попадает в ожидаемый прослушиватель)

Ответ №1:

По словам нашего специалиста по базам данных, в Oracle Internet Directory (OID) были «неправильные записи».

Они его почистили, и теперь он снова работает. Извините, что это не очень полезный ответ, но я не знаю более подробных сведений…