2

Select ステートメントを介して Oracle データベースにクエリを実行するバックグラウンド スレッドがあります。このステートメントは、ResultSet Java オブジェクトを取り込みます。クエリが多くの行を返す場合、ResultSet オブジェクトが非常に大きくなる可能性があります。大きすぎる場合は、バックグラウンド スレッドをキャンセルしたいのですが、もっと重要なのは、ResultSet オブジェクトを作成して Java メモリを大量に消費しているスレッドをキャンセルしたいということです。

私がこれまでオンラインで読んだことによるjava.sql.Statement cancel()と、これを行うための最良の方法のように思われます。誰でもこれを確認できますか? より良い方法はありますか?

java.sql.Statement close()おそらくExhaustedResultset例外をキャッチできますが、それは安全ではないかもしれません。

明確にするために、ResultSetもスレッドも必要ありません-両方をメモリから完全に破棄したいのです。

4

3 に答える 3

1

これは JDBC の実装に依存します。Statement.cancel() は JDBC ドライバー クラスへの要求であり、必要または期待することを行う場合と行わない場合があります。

ただし、選択 (通常は非トランザクション) を実行していて、JDBC のデフォルトの行プリフェッチ プロパティが 10 であることを確認すると、おそらくこれでうまくいくはずです。同様の/関連する情報については、この回答を参照してください。

JDBC アプリケーションで PreparedStatement.cancel() を呼び出すと、実際に Oracle データベースで強制終了されますか?

于 2013-07-23T13:47:54.643 に答える
1

Oracle には、ドライバーのバージョンに応じたメモリ管理に関する優れたドキュメントがあります。

于 2013-07-23T15:00:37.460 に答える
1

クエリの結果が本当に必要な場合は、スレッドをキャンセルしても問題は解決しません。

メモリの使いすぎが心配な場合は、resultSet でフェッチ サイズを設定できます。これにより、一度に返される行数が制限されます。次に、結果セットを消費する必要があります(結果セットの行をコピーしているデータ構造にデータが積み重なると、メモリを食い尽くすことになります)。

于 2013-07-23T14:08:43.737 に答える