2012-02-08 30 views
1

Tomcat 6、Java 6(openjdk)、centos 6.2で動作する新しいTomcatアプリケーションサーバーがあります。サーバは、centos 6.2ホスト上でqemu-kvmの下で動作する仮想マシンです。ホストとゲストの両方が64ビットです。オラクルシンJDBC接続がアクティブでない状態で「接続リセット」を受け取る

接続が開かれた場合(接続プールから)、接続が使用されていない約4時間、「長い計算」が発生します。最後に、「コミット」が発行され、サーバは、具体的には、「接続リセット」例外を与える:サーバーは、実際の物理ホストである以外

Caused by: java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:185) 
    at oracle.net.ns.Packet.receive(Packet.java:282) 
    at oracle.net.ns.DataPacket.receive(DataPacket.java:103) 
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:175) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:100) 
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:85) 
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122) 
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179) 
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 
    at oracle.jdbc.driver.T4C7Ocommoncall.doOCOMMIT(T4C7Ocommoncall.java:75) 
    at oracle.jdbc.driver.T4CConnection.doCommit(T4CConnection.java:558) 

データベース・サーバーとクライアントは、同じサブネット上にあります、明らかに、app-serverは、同じサブネット上の物理マシン内で実行されているゲストです。

ホストは「ブリッジ」ネットワークを使用しました。

これはソフトウェアの問題ではなく、Linux OSの設定(iptables?)の問題ですが、実際はわかりません。

答えて

1

私はこれを数回実行しました。ほとんどの場合、ネットワークタイムアウト(ロードバランサまたはファイアウォール)が原因です。しかし、あなたのサーバーは同じサブネット上にあると明確に言及しているので、何が起こっているのかは分かりません。あなたはiptablesの疑いがあるので、あなたはあなたがOracle DBに接続していると仮定すると、

かかわらず、それをオフにテストを実行し、それが動作するかどうか、あまりにも簡単だよね:)(参照することができ、以下の微調整は

http://raibledesigns.com/rd/entry/tomcat_oracle_connectivity_problems

を支援します

異なるデータベース(mysqlなど)を使用している場合、設定は異なる可能性がありますが、ロジックは同じです。接続が長時間アイドル状態にならないように、キープアライブ値を設定します。この方法でFirewal/Load Balancer/iptablesソフトウェアはそれを終了しません。

+0

私はこの問題が間接的にiptables設定をフラッシュしてリロードする "system-config-firewall-tui"を実行することによって起こったと考えています。これにより、いくつかの既存の接続が切断されます。 – dmansfield

0

オラクル・フォーラムのthisに記載されているように、これには複数の問題があります。 JDBCドライバのバージョンは

  • あなたのORACLE_HOME環境変数が
  • 正しいチェックされている場合

    • チェック-Djava.security.egd=file:///dev/urandom
    • あなたのロジックは、接続を取得するためにシングルトンを使用して引数を追加してみてください?投稿にもこのように記載されています

    希望します。

    +0

    私が読んだとおり、/ dev/urandom fixは接続タイムアウトです。これは接続され、有効であり、いくつかのステートメントに使用され、アイドル状態になっています。/dev/urandomの修正はまだ可能ですか? – dmansfield

    +0

    申し訳ありませんが、すぐに入力してください。 ORACLE_HOMEと他のsqlnet.oraの調整に関しては、私が使用している(指定していない)** thin **ドライバには当てはまらないと思います。ドライバのバージョンは確かに確認します。 – dmansfield

    1

    @userは、sqlnet.oraで "SQLNET.EXPIRE_TIME = 10"を構成することにより、適切な回避策を示しています。

    ただし、この回避策は、薄い(jdbc:thin)ドライバではなく、太いOCI(jdbc:oci)を使用している場合にのみ適用できます。

    Linuxには、ソフトウェアのファイアウォール、つまりiptablesがあり、アイドル状態のネットワーク接続を切断する可能性があるため、iptablesソフトウェアのファイアウォールが同じサブネットにあっても使用できます。これは、現代のすべてのLinuxではデフォルトで有効になっていて、Linux管理者まで無効にしています。

    デフォルトでは、Linux iptablesはアイドル状態のTCP/IP接続をドロップしません(jdbcはTCP/IPプロトコルに属します)。そのためLinux管理者はiptablesを設定する必要があります。より多くのを知って興味を持っているすべての読者のための詳細な説明を以下に示します。

    http://www.digitage.co.uk/digitage/software/linux-security/cutter

    ビジネスユーザー、セキュリティチーム、または建築家は、多くの場合、ネットワーク/ OS管理者がルータとしてだけでなく、ファイアウォールを使用してアイドル状態の接続を中止することをお勧めします。これは、常にハッキング防止コミュニティの「推奨事項」ですが、適切に議論されておらず、アプリケーションが不安定になっています。結局のところ、チームと話し合って天秤を見つけてください。