JDBCでは、setFetchSize(int)
メソッドは、JVMからデータベースへのネットワーク呼び出しの数とそれに対応してResultSet処理に使用されるRAMの量を制御するため、JVM内のパフォーマンスとメモリ管理にとって非常に重要です。
本質的に、setFetchSize(10)が呼び出され、ドライバーがそれを無視している場合、おそらく2つのオプションしかありません。
- フェッチサイズのヒントを尊重する別のJDBCドライバーを試してください。
- 接続のドライバー固有のプロパティ(接続インスタンスを作成するときのURLやプロパティマップ)を確認します。
RESULT-SETは、クエリに応答してDB上でマーシャリングされた行の数です。ROW-SETは、JVMからDBへの呼び出しごとにRESULT-SETからフェッチされる行のチャンクです。これらの数処理に必要な呼び出しと結果のRAMは、フェッチサイズの設定によって異なります。
したがって、RESULT-SETに100行があり、fetch-sizeが10の場合、常に約10 * {row-content-size} RAMを使用して、すべてのデータを取得するために10回のネットワーク呼び出しが行われます。
>デフォルトのフェッチサイズは10で、かなり小さいです。投稿された場合、ドライバーはフェッチサイズ設定を無視し、1回の呼び出しですべてのデータを取得しているように見えます(大容量のRAM要件、最適な最小ネットワーク呼び出し)。
ResultSet.next()
の下で何が起こるか つまり、RESULT-SETから一度に1行を実際にフェッチするわけではありません。これは(ローカルの)ROW-SETからフェッチし、ローカルクライアントで使い果たされると、サーバーから次のROW-SETを(目に見えない形で)フェッチします。
設定は単なる「ヒント」であるため、これはすべてドライバーによって異なりますが、実際には、これが多くのドライバーとデータベースでどのように機能するかを確認しました(Oracle、DB2、MySQLの多くのバージョンで確認済み)。