2009-03-23 13 views
1

Javaコードの一部で自動バルクテストを実行したときに、奇妙な "Invalid Packet Lenght"(エラーの綴り方)エラーが発生しました。誰かがこのエラーを以前に遭遇したか、正しい方向に向けることができます。JDBC Thin Driver:無効なパケット長

JUnitユニットテストまたはGUIからコードをテストするときにこのエラーが発生することはありません。私は私の自動バルクテストでこのエラーに遭遇します。私の一括テストについて少し:いくつかの入力に対して、私のコードは長い間実行されるでしょう(それは予想されます)。しかし、より合理的な時間枠に結果をスピードアップするためには、それぞれを実行するための新しいスレッドを作成しています私はいくつかの与えられた最大経過時間の後にテストを停止することができるように個々のテスト。

データをロードするには、テストコードと実際のコードの両方を同じデータベースインスタンスに接続する必要があることに注意してください。実際のコードは、単一の接続を使用してデータベースから読み取ります(マルチスレッドではありません)。私はまだテストがデータベースに接続するための最善の方法を見つけようとしています(したがってこの質問)。

私の最初の考えは、テストスレッドを閉じて、実行を早期にやめるようなやり方では面白くないことをやっているということでした。私の実際のコードを内蔵スレッドを殺すために何の「やさしい」方法はありませんマルチスレッドではありませんので、私は非推奨

threadObject.stop(); 

メソッドを呼んでいる。(〜2-3)、いくつかのスレッドを停止した後、私のJDBC接続は1つの "無効なパケット長さ"エラーの後に "ソケットクローズ"例外を残りのテストでスローします。

私は同じ結果とこれらのすべてを試してみた:

  • リユース 実際のコードを再利用するすべての のテストのために同じ第二の接続つの新しい接続を作成します
  • を使用するのと同じ接続を
  • 停止するたびにテスト接続を閉じて再作成する 長時間実行テスト
  • テストごとに新しい接続を作成する(これは接続カウントを最大にするまで有効)

"test"と "actual"という2つの接続のうち、 "test"接続が例外をスローする接続であることが判明しました。

構成:

  • のEclipse 3.4
  • Javaのコンプライアンス1.6
  • JDBCドライバojdbc14_g.jar
  • のOracle 9 DB

私が間違って何をしているのですか? "テスト"接続を処理する別の方法はありますか?バルクテストを実行するだけの "実際の"接続を再構築する必要がありますか? "Invalid Packet Lenght"エラーの原因

+0

これは実際には、StackOverflowの_title_の「lenght」の中で最も古い形式です。それは修正するのが間違っているため、常にそのままになります。 –

答えて

2

私は本当にあなたが一括テストで達成しようとしているのか理解していないので、私は私の知っているスレッドとConnection Sに関するいくつかの一般的なアドバイスを提供します。あなたのスレッドの

  1. おそらく1を無効な状態で接続を残しています。スレッドが停止したときに接続はどうなりますか?一般的に言えば、オペレーションの途中でスレッドを停止するのではなく、をInterruptedExceptionの場所に配置する必要があります。 Connectionは、例外が発生したかどうかにかかわらず、ブロックfinallyで閉じなければなりません。

  2. JDBC操作のタイムアウトを設定する場合は、Statement.setQueryTimeout()を使用します。

  3. C3P0のような接続プールの使用を検討してください。特にコードで設定するのは簡単です。具体的にはthisを見てください。これは、接続のセットアップ/解体のほとんどを処理し、有効ですぐに使用できる接続をコードに提供します。

  4. 独自の実行戦略を展開するのではなく、Java独自のjava.util.concurrentパッケージを使用することを検討してください。 ExecutorsExecutorServiceクラスを見てください - それらは別々のスレッドでタスクを実行し、タイムアウトを設定する手段を提供します。

これはいくつか役立ちます。

+0

#1は一言で言えばかなり問題なので、私はこの答えを受け入れるつもりです。 Thread.stop()を呼び出すと、接続が矛盾した状態になりました。残念ながら、私はスレッド化されていないコードをスレッドでテストする偉大な方法を考えることはできません。したがって、タイムアウトでビルドするためにリファクタリングする必要があります。 – Mark

関連する問題