JDBC 呼び出しを行っていて、データベースからResultSet
. しかし、ネットワークの問題により、データベースとの接続が失われました。
( Connection
、Statement
およびResultSet
DB で閉じられていません)。を反復処理できResultSet
ますか?
できたとしても、非常に特定の jdbc ドライバーに対してコーディングしていない限り、そうすべきではありません。場合によっては、結果セットがまったく構築されないことがあります。その他(Oracle IIRC)では、合計から特定の数の行のみをフェッチするように構成できます。
ただし、一般に、接続が失われた場合、部分的にフェッチされた結果セット オブジェクトを反復処理できるかどうかを考えるよりも、心配することがたくさんあります。そのような場合、経験則は
また、経験則として、トランザクション内でステートメントを実行するときの部分的な失敗について心配する必要はありません。破棄して、新たに再試行してください。
まれに、操作を再試行できるかどうかを示すベンダー固有のコード ( SQLException.getErrorCode() ) が DB から送信されることがあります。Oracle には、挿入を行って一意の制約に違反した場合の特定のコードがいくつかあります (覚えていないでください)。このような失敗した操作を再試行できる場合もありますが、それはベンダーおよびビジネス固有のものです。
一般に、破損した結果セットをダンプして、最初からやり直してください。
JDBCドライバーがそれをどのように処理するかに完全に依存していると確信しています。接続が失われる前に、すべての結果をバッファリングした可能性があります。接続が失われる前に、次の 10 件の結果のみをバッファリングした可能性があります。すべての結果がバッファリングされた場合でも、バッファリングされた結果の反復処理が完了する前に、ドライバー自体が例外のスローを開始する場合があります。
個人的には、ネットワーク中断後の動作は未定義と見なされると思います。
通常、どの種類の「結果セット全体」オブジェクトも、完全な行セットが正常に受信されるまで完全には構築されません。たとえば、オブジェクトに NumberRecordsAffected のようなプロパティがある場合、すべての行を受け取っている必要があります。
ただし、GetFirstRow/GetNextRow のような列挙可能なオブジェクトは、通常、一度に行のチャンクをダウンさせるため、現在のバッファーが使い果たされ (行をバッファーする場合)、次の行をフェッチしようとするまで、接続が切断されたことはわかりません。デシベルから。
どちらの場合でも、例外がスローされることを期待しますが、IANAJDBCD (私は jdbc 開発者ではありません)。