#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