Проблема с подключением Tomcat 8 JDBC и Oracle PDB

#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?