- - PR -
I/O例外について
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-02 09:33
初めて質問します。
いろいろ調べてみたのですが、下記Exceptionで困っています。 sql.SQLException: I/O例外: Invalid Packet Lenght ループ中で条件を変えてSELECT文を発行してまして 何回目か(特定できない)に上記エラーで異常終了してしまいます。 なにかヒントなどありましたらご教授ください。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2003-07-02 10:01
下記のようなことは試されていますか? ・静的ステートメントを使用しているなら、動的ステートメントに変更する。 ・途中でStatmentとResultSetをクローズしてから、再度オープンしてみる。 ・JDBCドライバを変更する。 例外といってもSQLExceptionなので、DBに依存します。 | ||||||||
|
投稿日時: 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上で動いてます。 なにかお気づきの点がありましたらお願いします。 ありがとうござました。 | ||||||||
|
投稿日時: 2003-07-02 11:33
静的、動的というのは、 静的ステートメント:java.sql.Statment 動的ステートメント:java.sql.PreparedStatement ということです。 上記のSQL文からして、静的ステートメントを使用しているはずです。 上記のようなSQL文を実行する場合、 動的ステートメントを使用した方がパフォーマンスが良いです。 SQL文の見た目も SELECT * from tmp where a=? こんな感じになるので、見やすいですね。 それと、シングルクォート等の特殊文字を変換しなくても、 SQL文の構文エラーは起きませんし。 できるだけ動的ステートメントを使用した方が良いです。
私自身、JDBCドライバをTYPE3からTYPE2に変更することで、 例外が発生しなくなったことがありました。 オラクルの場合、TYPE2とTYPE4ですが、 TYPE4からTYPE2への変更なら変化があるかもしれません。 ただし、オラクルでTYPE2を使用する場合、 オラクルクライアントをインストールしてないと駄目だったような・・・。 JDBCドライバの変更はローカル環境で試されてからにしてはどうでしょうか? [ メッセージ編集済み 編集者: taku 編集日時 2003-07-02 11:37 ] | ||||||||
|
投稿日時: 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-08-29 14:46
皆様回答が遅くなって申し訳ありませんでした。
結果的にjavaのバージョン or Dominoのバグ?ということになりました。 みなさまからいただいた情報を元にテストを行いましたが 結局、DominoのJavaエージェントで実行して出力されていたエラーでして、 普通のjavaアプリケーションにしたところ正常に動作するようになりました。 皆様ほんとうにありがとうございました。 | ||||||||
1
