#java #oracle #tomcat #jdbc
#java #Oracle #tomcat #jdbc
Вопрос:
У меня есть веб-приложение Java 8, которое работает на Tomcat 8. Я настроил соединение JDBC в server.xml файл для подключения к контейнерной базе данных Oracle 12c.
<Resource accessToUnderlyingConnectionAllowed="true" auth="Container" driverClassName="oracle.jdbc.OracleDriver" maxIdle="10" maxTotal="25" maxWaitMillis="10000" name="jdbc/LOCALDB" type="javax.sql.DataSource" url="jdbc:oracle:thin:admin/admin123@localhost:1521/DBSVC"/>
Для моего приложения я использовал как ojdbc6, так и ojdbc7. Когда я запускаю Tomcat и пытаюсь подключиться к базе данных, я получаю следующую ошибку:
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Несмотря на ошибку, SQLPlus и SQL Developer могут подключаться к службе и SID, поэтому соединение определенно работает. Эта статья (https://oracle-base.com/articles/12c/multitenant-connecting-to-cdb-and-pdb-12cr1 ) предполагает, что вы можете увидеть эту ошибку при использовании JDBC и использовать следующее свойство в файле конфигурации прослушивателя.
USE_SID_AS_SERVICE_listener=on
Это, к сожалению, не работает для меня, и это только изменяет ошибку с приведенной выше на следующую:
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
Вывод для состояния lsnrctl показывает:
[oracle@bcc0fa014b84 ~]$ lsnrctl status
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 22-OCT-2020 11:50:45
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date 22-OCT-2020 11:49:29
Uptime 0 days 0 hr. 1 min. 16 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/12.2.0.1/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/bcc0fa014b84/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=bcc0fa014b84)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/DBX/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "DBX" has 1 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Service "DBXXDB" has 1 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Service "aeb6317d78400953e053020011ac120e" has 2 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Instance "DBX", status READY, has 2 handler(s) for this service...
Service "dbsvc" has 2 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Instance "DBX", status READY, has 2 handler(s) for this service...
The command completed successfully
Службы в базе данных следующим образом:
[oracle@bcc0fa014b84 ~]$ lsnrctl services
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 22-OCT-2020 11:54:31
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
Services Summary...
Service "DBX" has 1 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:1 refused:0 state:ready
LOCAL SERVER
Service "DBXXDB" has 1 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: bcc0fa014b84, pid: 89>
(ADDRESS=(PROTOCOL=tcp)(HOST=bcc0fa014b84)(PORT=36517))
Service "aeb6317d78400953e053020011ac120e" has 2 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:1 refused:0 state:ready
LOCAL SERVER
Instance "DBX", status READY, has 2 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: bcc0fa014b84, pid: 89>
(ADDRESS=(PROTOCOL=tcp)(HOST=bcc0fa014b84)(PORT=36517))
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "dbsvc" has 2 instance(s).
Instance "DBX", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:1 refused:0 state:ready
LOCAL SERVER
Instance "DBX", status READY, has 2 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: bcc0fa014b84, pid: 89>
(ADDRESS=(PROTOCOL=tcp)(HOST=bcc0fa014b84)(PORT=36517))
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
The command completed successfully
В нынешнем виде я не понимаю, почему Tomcat не может подключиться к моей базе данных Oracle. У кого-нибудь есть какие-либо идеи относительно того, почему это может быть? Я что-то упустил?
Комментарии:
1. Каков вывод «состояния lsnrctl»? Какое имя службы создается после изменения на USE_SID_AS_SERVICE_listener?
2. Привет! Спасибо, что перезвонили мне. Обновлено сообщение с запрошенным выводом, но оно показывает слушателей, доступных для подключения к службам, готовым, насколько я понимаю, к выводу. Я не уверен, какая служба была создана в результате добавления USE_SID_AS_SERVICE_listener, я не знал, что она создала новую.
3. Вы пробовали «127.0.0.1» вместо «localhost» в URL-адресе JDBC?