1

JDBC 呼び出しを行っていて、データベースからResultSet. しかし、ネットワークの問題により、データベースとの接続が失われました。

( ConnectionStatementおよびResultSetDB で閉じられていません)。を反復処理できResultSetますか?

4

3 に答える 3

4

できたとしても、非常に特定の jdbc ドライバーに対してコーディングしていない限り、そうすべきではありません。場合によっては、結果セットがまったく構築されないことがあります。その他(Oracle IIRC)では、合計から特定の数の行のみをフェッチするように構成できます。

ただし、一般に、接続が失われた場合、部分的にフェッチされた結果セット オブジェクトを反復処理できるかどうかを考えるよりも、心配することがたくさんあります。そのような場合、経験則は

  1. 最悪の事態を想定する。
  2. 結果セット、ステートメント、および接続を閉じようとします。物理的な接続が失われた場合でも、メモリやファイル ハンドルなどのリソースを呼び出し側で破棄する必要がある場合があります。
  3. 可能であれば、新しい接続 (新しい物理接続または接続プールから) の取得を試み、最初からやり直してください。

また、経験則として、トランザクション内でステートメントを実行するときの部分的な失敗について心配する必要はありません。破棄して、新たに再試行してください。

まれに、操作を再試行できるかどうかを示すベンダー固有のコード ( SQLException.getErrorCode() ) が DB から送信されることがあります。Oracle には、挿入を行って一意の制約に違反した場合の特定のコードがいくつかあります (覚えていないでください)。このような失敗した操作を再試行できる場合もありますが、それはベンダーおよびビジネス固有のものです。

一般に、破損した結果セットをダンプして、最初からやり直してください。

于 2010-04-02T16:24:18.090 に答える
3

JDBCドライバーがそれをどのように処理するかに完全に依存していると確信しています。接続が失われる前に、すべての結果をバッファリングした可能性があります。接続が失われる前に、次の 10 件の結果のみをバッファリングした可能性があります。すべての結果がバッファリングされた場合でも、バッファリングされた結果の反復処理が完了する前に、ドライバー自体が例外のスローを開始する場合があります。

個人的には、ネットワーク中断後の動作は未定義と見なされると思います。

于 2009-06-04T17:03:43.290 に答える
1

通常、どの種類の「結果セット全体」オブジェクトも、完全な行セットが正常に受信されるまで完全には構築されません。たとえば、オブジェクトに NumberRecordsAffected のようなプロパティがある場合、すべての行を受け取っている必要があります。

ただし、GetFirstRow/GetNextRow のような列挙可能なオブジェクトは、通常、一度に行のチャンクをダウンさせるため、現在のバッファーが使い果たされ (行をバッファーする場合)、次の行をフェッチしようとするまで、接続が切断されたことはわかりません。デシベルから。

どちらの場合でも、例外がスローされることを期待しますが、IANAJDBCD (私は jdbc 開発者ではありません)。

于 2009-06-04T20:02:39.153 に答える