Сброс соединения JDBC и Oracle 11g в Ubuntu

У меня странная проблема с подключением JDBC к Oracle 11g. Это произошло внезапно в этот понедельник без каких-либо изменений настроек, которые были известны мне или команде. Читая на форумах Stackru и Oracle (см. Ссылки внизу), я узнал, что существует проблема с генерацией случайных байтов на 64-битных машинах Linux. Это заставило меня попробовать несколько вещей, которые, к сожалению, не сработали. Вот краткое изложение всей информации, которую я знаю.

Странно то, что я могу подключиться через терминал, используя sqlplus, но не используя JDBC.

Спасибо за любые идеи или помощь,

Amit

Моя настройка:

OS: Ubuntu 12.04
Java: Both 7 and 6_45 (Issue is the same)
JDBC: Downloaded from the Oracle official site (see further description down)
    Connection behind a Cisco VPN

JDBC-манифесты:

odbc7.jar:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.12-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.1.0
Repository-Id: JAVAVM_12.1.0.1.0_LINUX.X64_130403
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false

odbc6.jar:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.12-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.1.0
Repository-Id: JAVAVM_12.1.0.1.0_LINUX.X64_130403
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false

В пятницу все еще работало

  • Я мог запустить свое приложение и иметь соединение Java с БД Oracle.
  • С понедельника у меня эта проблема
  • На моем старом компьютере (Ubuntu 12.04), которого я почти неделю не трогал, тоже появилась эта проблема, хотя я оставил ее в рабочем состоянии.

Терминальное соединение с использованием SQLPLUS работает:

amit @ mymachine: / usr / lib / oracle $ sqlplus / @ DB_HOST_IP: 1521 / DB_NAME

SQL * Plus: выпуск 12.1.0.1.0, выпуск продукции - вторник, 22 апреля 11:35:58 2014 г.

Copyright (c) 1982, 2013, Oracle. Все права защищены.

Подключено к: Oracle Database 11g Release 11.2.0.3.0 - 64-битное производство

SQL>

Но соединение с JDBC не работает:

DriverManager.getConnection(
                    "jdbc:oracle:thin:@//DB_HOST_IP:1521/DB_NAME", username,
                    password);

Зависает около 20 секунд и бросает:

ava.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:682)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:711)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:558)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at OracleJDBC.main(OracleJDBC.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at oracle.net.ns.Packet.receive(Packet.java:311)
    at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:249)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:171)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:89)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
    at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:426)
    at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:688)
    at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:595)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1439)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    ... 12 more

Из журнала сервера:

Fatal NI connect error 12170.

  VERSION INFORMATION:
        TNS for Linux: Version 11.2.0.3.0 - Production
        Oracle Bequeath NT Protocol Adapter for Linux: Version
11.2.0.3.0 - Production
        TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.3.0 - Production
  Time: 22-APR-2014 09:57:45
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535

TNS-12535: TNS:operation timed out
    ns secondary err code: 12606
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
  Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=<my.ip.address>)(PORT=42738))

Из документации Oracle по обоим ошибкам сервера:

ORA-12535: TNS:operation timed out
Cause: The requested operation could not be completed within the time out period.
Action: Look at the documentation on the secondary errors for possible remedy. See SQLNET.LOG to find secondary error if not provided explicitly. Turn on tracing to gather more information.

ORA-12606: TNS: Application timeout occurred
Cause: A network session did not reach an application-defined stage within the allowed time interval.
Action: This is an error which does not normally appear at the high level. The action to take is application specific, and is detailed in the higher level error description.

Решения, которые я пробовал:

  1. Добавление следующего системного свойства -Djava.security.egd=file:///dev/urandom как предложено в обсуждении Stackru ниже.
  2. Настройте rng-tools, чтобы "помочь" генератору энтропии ОС. (см. ссылки)

  3. Следующий код выполняется без проблем, создавая случайные байтовые массивы (независимо от параметра -Djava.security.egd:

int a = 10000; while (a-- > 0){ byte[] array = new byte[2048]; new SecureRandom().nextBytes(array); System.out.println(a); }

Ничто из вышеперечисленного не изменило ошибку (время ожидания).

РЕДАКТИРОВАТЬ: новые попытки:

  1. Запустив свое приложение, я смог распознать точный запрос, который вызывает у меня живую проблему. Это при чтении столбца CLOG размером 1-2 КБ.

SQL> select secure_params from session_token where id=11065073; <- запрос застрял.

Перезапустите клиент,

все больше обновляя это поле в этой конкретной строке, я все еще мог прочитать поле, если бы оно было размером 429 символов, но затем, когда я увеличил его до 587 символов, оно снова застряло.

    SQL>  select length( secure_params) from session_token where id=11065073;

    LENGTH(SECURE_PARAMS)
    ---------------------
                      587

SQL> select secure_params from session_token where id=11065073; <- запрос снова застрял.

Попытки номер 4 подводят меня к мысли, что здесь может быть дополнительная проблема, так как приложение может создать начальное соединение и получить некоторые короткие данные из БД, но только в этом случае происходит сбой, когда набор результатов становится немного толстым.

Конец редактирования

Ссылки:

Stackru: периодически возникающая проблема соединения Oracle JDBC

Генератор энтропии Rng: http://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny

1 ответ

ORA-12170 указывает, что не удалось установить соединение TCP с прослушивателем базы данных.

Если это ошибка, которая происходит постоянно, проверьте брандмауэры и ACL сети. Возможно что-то посредническое изменилось?

В качестве альтернативы это может быть какой-то другой артефакт, влияющий на подключение TCP, например, конфликт IP-адресов. Недавно я сам столкнулся с этой проблемой и написал об этом в блоге по адресу http://distracted-it.blogspot.co.nz/2014/04/ora-12170-tnsconnect-timeout-resolved.html

Надеюсь, поможет.

Другие вопросы по тегам