#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) были «неправильные записи».
Они его почистили, и теперь он снова работает. Извините, что это не очень полезный ответ, но я не знаю более подробных сведений…