4

JDBC を Oracle 11g に接続するという奇妙な問題が発生しています。私やチームが認識していた設定の変更なしに、今週の月曜日に突然発生し始めました. Stackoverflow および Oracle フォーラム (下部のリンクを参照) を読んで、Linux 64 ビット マシンでのランダム バイトの生成に問題があることを知りました。いくつかのことを試してみましたが、残念ながらうまくいきませんでした。ここに私が知っているすべての情報をまとめます。

奇妙なことに、sqlplus を使用して端末経由で接続できますが、JDBC を使用することはできません。

アイデアや助けをありがとう、

アミット

私のセットアップ:

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

金曜日には、すべてがまだ機能していました。

  • アプリケーションを起動して、Oracle DB への Java 接続を確立できました。
  • 月曜日以来、私はこの問題を抱えています
  • 私の古いコンピューター(Ubuntu 12.04)も、動作状態のままにしていたにもかかわらず、ほぼ1週間触れていなかったので、この問題も発生し始めました。

SQLPLUS を使用した端末接続が機能しています:

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

SQL*Plus: 2014 年 4 月 22 日火曜日 11:35:58 に 12.1.0.1.0 をリリース

著作権 (c) 1982 年、2013 年、オラクル。全著作権所有。

接続先: Oracle Database 11g リリース 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以下の Stackoverflow の説明で提案されているように、次のシステム プロパティを追加します。
  2. rng-tools をセットアップして、OS のエントロピー ジェネレーターを「支援」します。(リンクを参照)

  3. 次のコードは、ランダムなバイト配列を生成する問題なく実行されます (パラメーターに関係なく-Djava.security.egd:

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

上記のいずれもエラー (タイムアウト) を変更していないようです。

編集:新しい試み:

  1. アプリケーションを実行すると、ライブの問題を引き起こす正確なクエリを認識できました。これは、サイズが 1 ~ 2kb の CLOG 列を読み取る場合です。

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;<- クエリが再びスタックしました。

アプリケーションは最初の接続を作成し、DB から短いデータを取得できますが、結果セットが少し太くなったときにのみ失敗するため、試行番号 4 から、ここに追加の問題がある可能性があると思います。

編集の終わり

リンク:

Stackoverflow: Oracle JDBC の断続的な接続の問題

Rng エントロピー ジェネレーター: http://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny

4

1 に答える 1

2

ORA-12170 は、データベース リスナーへの TCP 接続が失敗したことを示します。

これが常に発生するエラーである場合は、ファイアウォールとネットワーク ACL を確認してください。おそらく何か仲介者が変わったのでしょうか?

または、IP アドレスの競合など、TCP 接続に影響を与えるその他のアーティファクトである可能性もあります。私は最近この問題を自分で抱えており、http: //distracted-it.blogspot.co.nz/2014/04/ora-12170-tnsconnect-timeout-resolved.html でブログを書いています。

それが役に立てば幸い。

于 2014-04-26T10:01:23.303 に答える