Ошибка ввода-вывода: сетевому адаптеру не удалось установить соединение при запуске oracle DB в качестве контейнера docker и попытке подключиться через Tomcat

#java #oracle #docker #tomcat

#java #Oracle #docker #tomcat

Вопрос:

Я настроил контейнер docker с oracle db, используя следующий yml.

 version: '3'
services:
  oracle:
    image: "carloscastillo/rgt-oracle-xe-11g"
    ports:
      - "49160:22"
      - "49161:1521"
      - "49162:8080"
    volumes:
      - "dbdata:/u01/app/oracle carloscastillo/rgt-oracle-xe-11g"
    environment:
      - ORACLE_ALLOW_REMOTE=true
      - ORACLE_ENABLE_XDB=true
volumes:
  dbdata:
  

Я пытаюсь получить доступ к БД в tomcat.Это Context.xml конфигурации БД.

 <Resource name="ORACLE" auth="Container" type="javax.sql.DataSource"
      factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
maxActive="100" maxIdle="30" maxWait="10000"
username="system" password="oracle" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:49161/xe"/>
  

Также добавлен соответствующий драйвер в путь к классу.Все еще получаю ошибку
«Ошибка ввода-вывода: сетевому адаптеру не удалось установить соединение «.
Также пробовал url как jdbc:oracle:thin:@localhost:49161:xe .Я делаю это впервые.Не удалось решить, что я делаю неправильно.

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

1. Добро пожаловать в StackOverflow @Sandali95! Как насчет вашего процесса tomcat. Он также работает в контейнере? режим моста?

2. Привет @BjarteBrand, нет, это не так. Запуск tomcat в Eclipse.

Ответ №1:

Я попробовал ваш docker-compose. Работал из коробки на моем macOS. Я предлагаю вам добавить двойную косую черту в строку подключения.

 jdbc:oracle:thin:@//localhost:49161/xe
  

Двойная косая черта должна сообщать вашему драйверу JDBC: «Эй, не пытайтесь использовать какую-либо информацию о среде, кроме той, которую я даю вам исключительно в этой строке» — EZConnect (EasyConnect)»

Совет всегда заключается в том, чтобы убедиться, что вы можете подключиться из sqlplus или sqlcl, прежде чем переходить к любой библиотеке приложений (java, python, php и т. Д.). Вот так:

 sqlplus system/oracle@//localhost:49161/xe

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 11 13:11:30 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

system@XE> @inst

INSTANCE INFORMATION

Ins                                                                          Stat Para             DB     Shdn
  # Instance             Host                   Version    Up since          us   llel Th# Arch    Status Pend Logins  SGA Size (GB)
--- -------------------- ---------------------- ---------- ----------------- ---- ---- --- ------- ------ ---- ------- -------------
  1 XE                   5600801e8a25           11.2.0.2.0 11.11.20 11:58:33 OPEN NO     1 STOPPED ACTIVE NO   ALLOWED             1

Elapsed: 00:00:00.02
  

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

 # restart the container until it works. Second or third time it normally works....
docker-container restart oracle 

# fire up the listener. Remember to run as 'oracle' and wait for 10s until the service_name 'XE' is exposed in the listener process
docker-compose exec -u oracle oracle sh -c "lsnrctl stop;lsnrctl start;echo 'alter database register' | sqlplus / as sysdba; sleep 10; lsnrctl status"

# For real world CI/CD scenarios I will add a healthcheck to the docker-compose service.
    healthcheck:
      test: sql -L -S sys/oracle@localhost:1521/XE as sysdba < /dev/null |grep 'ORA-'; if [[ $$? == 1 ]]; then echo 0; else echo 1; fi
      interval: 1m
      timeout: 10s
      retries: 20
      start_period: 40s
  

Удачи!

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

1. Привет @BjarteBrand, спасибо за быстрый ответ. я попытался войти в sl * plus. sqlplus system/oracle@//localhost:49161/xe SQL*Plus: Release 11.2.0.2.0 Production on Wed Nov 11 15:35:09 2020 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-12541: TNS:no listener Enter user-name: system Enter password: Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production SQL> @inst SP2-0310: unable to open file "inst.sql"

2. Даже при этом я могу получить доступ к базе данных через sql * plus. Но при попытке подключиться к eclipse он по-прежнему выдает ту же ошибку.

3. @Sandali95 ORA-12541: TNS: нет слушателя, я видел это много раз, работая с контейнерами oracle docker. Процесс прослушивания не запущен. Моя атака заключается в том, чтобы просто перезапустить контейнер. В конечном итоге запустятся как экземпляр oracle, так и прослушиватель. Я обновил свой ответ.

4. Спасибо за помощь. После перезапуска все работало нормально: D