- PR -

I/O例外について

1
投稿者投稿内容
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2003-07-02 09:33
初めて質問します。
いろいろ調べてみたのですが、下記Exceptionで困っています。
sql.SQLException: I/O例外: Invalid Packet Lenght

ループ中で条件を変えてSELECT文を発行してまして
何回目か(特定できない)に上記エラーで異常終了してしまいます。

なにかヒントなどありましたらご教授ください。
よろしくお願いいたします。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-07-02 10:01
引用:

オオタさんの書き込み (2003-07-02 09:33) より:
初めて質問します。
いろいろ調べてみたのですが、下記Exceptionで困っています。
sql.SQLException: I/O例外: Invalid Packet Lenght

ループ中で条件を変えてSELECT文を発行してまして
何回目か(特定できない)に上記エラーで異常終了してしまいます。

なにかヒントなどありましたらご教授ください。
よろしくお願いいたします。



 下記のようなことは試されていますか?
・静的ステートメントを使用しているなら、動的ステートメントに変更する。
・途中でStatmentとResultSetをクローズしてから、再度オープンしてみる。
・JDBCドライバを変更する。

例外といってもSQLExceptionなので、DBに依存します。
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2003-07-02 10:50
早速の返答ありがとうございます。
・途中でStatmentとResultSetをクローズしてから、再度オープンしてみる。
実施しましたがだめでした。
・静的ステートメントを使用しているなら、動的ステートメントに変更する。
select1
loop fetch数分
select2 条件 select1の結果
loop end
でselect2は"SELECT * from tmp where a="+param
と記述してますが、これは動的?ということでしょうか。
・JDBCドライバを変更する。
他の処理にも影響がでそうなので、今夜やってみます。

またDBはOracle8.1.7 windows2000上で動いてます。

なにかお気づきの点がありましたらお願いします。
ありがとうござました。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-07-02 11:33
引用:

オオタさんの書き込み (2003-07-02 10:50) より:
・静的ステートメントを使用しているなら、動的ステートメントに変更する。
select1
loop fetch数分
select2 条件 select1の結果
loop end
でselect2は"SELECT * from tmp where a="+param
と記述してますが、これは動的?ということでしょうか。


 静的、動的というのは、
静的ステートメント:java.sql.Statment
動的ステートメント:java.sql.PreparedStatement
ということです。
上記のSQL文からして、静的ステートメントを使用しているはずです。
上記のようなSQL文を実行する場合、
動的ステートメントを使用した方がパフォーマンスが良いです。
SQL文の見た目も
 SELECT * from tmp where a=?
こんな感じになるので、見やすいですね。
それと、シングルクォート等の特殊文字を変換しなくても、
SQL文の構文エラーは起きませんし。
できるだけ動的ステートメントを使用した方が良いです。

引用:

オオタさんの書き込み (2003-07-02 10:50) より:
・JDBCドライバを変更する。
他の処理にも影響がでそうなので、今夜やってみます。


 私自身、JDBCドライバをTYPE3からTYPE2に変更することで、
例外が発生しなくなったことがありました。
オラクルの場合、TYPE2とTYPE4ですが、
TYPE4からTYPE2への変更なら変化があるかもしれません。
ただし、オラクルでTYPE2を使用する場合、
オラクルクライアントをインストールしてないと駄目だったような・・・。

JDBCドライバの変更はローカル環境で試されてからにしてはどうでしょうか?

[ メッセージ編集済み 編集者: taku 編集日時 2003-07-02 11:37 ]
MINE
会議室デビュー日: 2003/07/02
投稿数: 17
投稿日時: 2003-07-02 19:18
はじめまして。

SQL文の発行件数を減らしてみてはどうでしょうか。

違うかも知れませんが、一度に大量のSQL文を発行して
いるために例外が発生しているような気がします。

select1のSQL文が単純にparam変数の値を取得するだけの
ものであれば、以下のような副問い合わせを使ったSQL文を
1度発行するだけでよいはずです。

select * from tmp where a in (select1);

またループ中にparam変数の値を加工していて、
単純に副問い合わせができないのであれば、
ループ中には以下のようなselect2のSQL文を作成し、
ループを抜けたあとに実行する形にすればよいと
考えます。
※多少の加工ならばnvl関数やdecode関数等のSQL関数や、
文字列連結を使うことでSQL文に組み込めます。

select * from tmp where a in (param1, param2, param3・・・);

select1がparam変数以外の値も取得していて、ループの中で
select1の結果とselect2の結果の両方の情報を使って
処理を行っているのであれば、テーブルを結合して
一気に情報を取得すればよいと思います。

このようにすれば、DBへのアクセスが最大でも2回となるので、
おそらく例外もでなくなるのではないかとおもいます。
SQL文の発行件数が増えればそれだけ処理速度も遅くなるので、
パフォーマンス的にもよいとおもいますが、どうでしょうか。
オオサカ
常連さん
会議室デビュー日: 2003/07/02
投稿数: 49
投稿日時: 2003-08-29 14:46
皆様回答が遅くなって申し訳ありませんでした。
結果的にjavaのバージョン or Dominoのバグ?ということになりました。
みなさまからいただいた情報を元にテストを行いましたが
結局、DominoのJavaエージェントで実行して出力されていたエラーでして、
普通のjavaアプリケーションにしたところ正常に動作するようになりました。

皆様ほんとうにありがとうございました。
1

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