Тестовый контейнер Oracle выдает «Ошибка ввода-вывода: получено минус один от вызова чтения»

#docker #oracle12c #testcontainers

#docker #oracle12c #тестовые контейнеры

Вопрос:

Я получаю исключение при подключении к oracle 12c, который находится в докере тестового контейнера oracle. Изображение докера Oracle 12c доступно здесь .

Вот мой код:

 OracleContainer oracleContainer = new OracleContainer("store/oracle/database-enterprise:12.2.0.1")
    .withUsername("sys")
    .withPassword("Oradoc_db1");
oracleContainer.start();

Class.forName(oracleContainer.getDriverClassName());

Connection connection = DriverManager.getConnection(oracleContainer.getJdbcUrl(), oracleContainer.getUsername(), oracleContainer.getPassword());
System.out.println(connection.toString());
  

Исключение:

 java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
    at oracle.net.ns.Packet.receive(Packet.java:286)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:287)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1054)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:308)
    ... 40 more
  

URL-адрес JDBC:
jdbc:oracle:thin:sys/Oradoc_db1@localhost:32779:xe

Docker успешно запущен, но не может подключиться к базе данных. Я уже ссылался на существующие решения по этой проблеме, но ни одно из них не было связано с тестовым контейнером Oracle в docker. Примечание:

  1. Docker работает хорошо и нормально.
  2. Проблемы с брандмауэром нет. Я уже отключил брандмауэр.
  3. URL-адрес JDBC также правильный.
  4. Также пробовал без использования OracleContainer . Настроенный образ вручную в docker. Я получил ту же ошибку.

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

1. используйте не localhost, а имя контейнера docker или IP-адрес шлюза, если БД запущена на хосте

2. Он запущен на локальном компьютере. Oracle 11g работает нормально. Не работает только 12c.

3. Что-то прослушивает порт 32779, но вы уверены, что это ваш слушатель Oracle? Это началось правильно и на этом порту? Вы можете получить эту ошибку, если случайно подключитесь к чему-то другому, и это не даст ожидаемой отсрочки.

4. @AlexPoole Этот URL-адрес jdbc генерируется OracleContainer и, похоже, он действителен для oracle 11g и 12c.