- PR -

JDBCエラー【17002】に関しての質問

投稿者投稿内容
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-07-02 14:24
いつもお世話になっております。
カメ吉SEと申します。

JSP、Servletを使用した画面でJDBCエラーが発生しており、
原因を特定するため再現をしたいのですが、再現出来ない
状態です。
何か原因の特定となる要素をご教授して頂きたく、
質問させて頂きました。

【環境】
HP-UX Itanium
JDK1.4.2
Oracle Database 10g Release 2
JDBC classes12.jar
TOMCAT Version 3.2.4

【エラーMSG】
コード:

jp.co.xxxxx.com.SystemException: java.sql.SQLException: I/0例外です。:パイプが壊れました。(errno:32)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:835)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:806)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:752)
at org.apache.tomcat.service.connector.Ajp12ConnecctionHandler.processConnection(Ajp12ConnectionHandler.java:166)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.utill.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
at java.lang.Thread.run(Thread.java:534)
java.sql.SQLException: I/0例外です。:パイプが壊れました。(errno:32)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:254)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
at java.sql.DriverManager.getConnection(DriverManager.java:514)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at jp.co.xxxxx.com(xxxxx.java:xxx)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:806)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:752)
at org.apache.tomcat.service.connector.Ajp12ConnecctionHandler.processConnection(Ajp12ConnectionHandler.java:166)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.utill.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
at java.lang.Thread.run(Thread.java:534)



WEBでエラーコードやメッセージを調査してみたのですが、
詳細な内容がありませんでした。
【参考時のサイト】
http://otn.oracle.co.jp/forum/message.jspa?messageID=11006115#11006115

関係あるかは別として、
JDBCドライバのファイルが違う事に気づきました。
OTNのドキュメントでは、
●classes12.jar
JDK 1.2およびJDK 1.3用のクラス。OracleのObject型およびCollection型によるNLSサポート用のクラスを除く、JDBCドライバ・クラスが含まれています。
●ojdbc14.jar
JDK 1.4用のクラス。OracleのObject型およびCollection型によるNLSサポート用のクラスを除く、JDBCドライバ・クラスが含まれています。
と記載されていました。

JDKのバージョンでサポートしていないJDBCを使用した場合、
不具合が発生する可能性はあるのでしょうか。
また、別のサイトに情報等がございますでしょうか。

申し訳ありませんが、ご教授の程、宜しくお願い致します。
不備・不明等がございましたら、ご指摘の程、宜しくお願い致します。


[ メッセージ編集済み 編集者: カメ吉SE 編集日時 2007-07-02 14:32 ]
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-07-02 14:40
逆に対応している JDK と JDBC の組み合わせで使わない理由は何なのでしょうか。
まずはサポートされている組み合わせで正常に動作するか確認すべきなのでは。
_________________
もしもし@RMAN 友の会
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-07-02 15:32
不具合が発生する可能性はいつでもあります。
サポートする JDK を使っていてもいなくても。
でも、サポートを受けるためにはサポートされているバージョンを利用する必要がありますね。
まずはサポートされているバージョンにして、それでも発生するようであればサポート窓口に問いあわせてはいかがでしょう。

ちなみに「パイプが壊れました」とか"Broken Pipe" とかはソケットにデータを送信している最中に相手から一方的にコネクションを切られた場合に発生します。
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-07-02 15:36
もしもしさん
返答ありがとうございます。

引用:

逆に対応している JDK と JDBC の組み合わせで使わない理由は何なのでしょうか。


ご指摘の通りです。
今回の問題はそこにもありまして、
現行システムを次期システムに移行するだけの予定でしたので、
方針としては、現行システムの資材をそのまま流用することでした。
なぜ、環境構築時に気がつかなかったかは、
JDBCの調査をしていませんでした。
実はリリース後に本事象が発生してしまい、
その際にJDBCの違いにも気づいて質問させて頂きました。

引用:

まずはサポートされている組み合わせで正常に動作するか確認すべきなのでは。


本来そうすべき所ですが、すぐに作業が出来ない状況な為、
先にそのようなご質問をさせて頂きました。

以上、宜しくお願いします。
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-07-02 15:54
インギさん
返答ありがとうございます。

引用:

ちなみに「パイプが壊れました」とか"Broken Pipe" とかはソケットにデータを送信している最中に相手から一方的にコネクションを切られた場合に発生します。


ご指摘された方法で実施してみました。

【作業内容】
@DBサーバのリスナーを切断した。(DBサーバは起動中)
A画面を確認。
【エラー内容】
【17002】のI/O例外が発生しました。
コード:
jp.co.xxxxx.com.SystemException: java.sql.SQLException: I/0例外です。: The Network Adapter could not eatablish the connection
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:835)
    at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
    at org.apache.tomcat.core.Handler.service(Handler.java:287)
    at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
    at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:806)
    at org.apache.tomcat.core.ContextManager.service(ContextManager.java:752)
    at org.apache.tomcat.service.connector.Ajp12ConnecctionHandler.processConnection(Ajp12ConnectionHandler.java:166)
    at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
    at org.apache.tomcat.utill.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
    at java.lang.Thread.run(Thread.java:534)
java.sql.SQLException: I/0例外です。: The Network Adapter could not eatablish the connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:111)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:145)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DagabaseError.java:254)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
    at java.sql.DriverManager.getConnection(DriverManager.java:514)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at jp.co.xxxxx.com(xxxxx.java:xxx)
    at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
    at org.apache.tomcat.core.Handler.service(Handler.java:287)
    at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
    at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:806)
    at org.apache.tomcat.core.ContextManager.service(ContextManager.java:752)
    at org.apache.tomcat.service.connector.Ajp12ConnecctionHandler.processConnection(Ajp12ConnectionHandler.java:166)
    at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
    at org.apache.tomcat.utill.ThreadPool$ControlRunnable.run(ThreadPool.java:501)
    at java.lang.Thread.run(Thread.java:534)



エラーコードは同じですが、違うエラーメッセージになりました。
(このエラーメッセージも出力されていましたので、参考になりました。
ありがとうございます。)

他に、「ソケットにデータを送信している最中に相手から一方的にコネクションを切られた場合」となる方法は御座いませんでしょうか。

ご教授のほど、宜しくお願い致します。
不備・不明等がございましたら、ご指摘の程、宜しくお願い致します。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-07-02 16:17
>他に、「ソケットにデータを送信している最中に相手から一方的にコネクションを切ら?>れた場合」となる方法は御座いませんでしょうか。

サーブレットとDBサーバの間のLANケーブルを抜く。

でどうでしょう。
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-07-03 09:50
progmanさん
返答ありがとうございます。

引用:

>他に、「ソケットにデータを送信している最中に相手から一方的にコネクションを切ら?>れた場合」となる方法は御座いませんでしょうか。

サーブレットとDBサーバの間のLANケーブルを抜く。

でどうでしょう。




説明が不足していました。
障害が発生した当日に、2万件データをバッチ処理で動かしていました。
(これは画面とは関係ない処理です。)
バッチ処理後に、画面を見にいけませんでした。
但し、同じ処理を行っても再現が出来ませんでした。
(開発環境で10万件を処理しても再現出来ませんでした)
他の処理からはDBに接続出来ている事は、
確認出来ていました。
対処としましては、Tomcatを再起動することで、
画面が見れるようになりました。
(DBサーバ、DBの再起動は行いませんでした。)
progmanさんのLANを抜く方法での再現に関しましては、
当日の障害とは別になってしまうのかなと。

ご提案して頂いたのに申し訳ありません。

もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-07-03 10:07
ネットワークがらみの障害ってパケットがどっち方向に流れているかによって動作が変わります。何度か試す必要がありそうかと。

で、JDBC ドライバの対応はどうなっているんでしょうか。
(入れ替えて CLASSPATH 直すだけなんじゃないの?)
_________________
もしもし@RMAN 友の会

スキルアップ/キャリアアップ(JOB@IT)