は私がresultSet.next():バッファORからデータベースからデータをフェッチしますか?
のステートメントフェッチサイズは10000ですstatement.executeQuery()が実行されたとき、それは、ResultSetのカーソルを返し、次のように
try (Connection connection = this.getDataSource().getConnection();
PreparedStatement statement = connection.prepareStatement(sqlQuery);) {
try {
statement.setFetchSize(10000); // Set fetch size
resultSet = statement.executeQuery();
while (true) {
resultSet.setFetchSize(10000);
boolean more = resultSet.next();
if (! more) {
break;
}
// populating an arraylist from the value from resultSet
}
}
catch (Exception e) {
LOGGER.error("Exception : "+e);
}
} catch (SQLException e) {
LOGGER.error("Exception : "+e);
}
私の理解では、以下のようなコードを持っています。メモリには10000行あります。 resultSet.nextが呼び出されると、メモリバッファから1行が取得されます。 (コールごとに1行)。メモリ内に行がなくなると、クエリが再度実行され、データベースから再度10000行がフェッチされ、バッファに格納されます。私の理解が正しければこれはDB
からフェッチする行が存在しなくなるまで続けますので、DBはを呼び出しますどのように多くの実際のは210000の合計行のためにそこになりますか?それは21ですか? (210000/10000)
また、(バッファの行がすべて読み込まれているとき)DBを呼び出して、より多くの行(私の場合は10000)を取得し、バッファに格納するとき。バッファーはいつクリアされますか?
私の理解が間違っている場合は、私に修正してください。
Oracle Databaseでは、何百万というデータを扱う必要があります。あなたのご質問にはお答えすることができます任意のポインタ/情報
よろしくため
おかげで、
SD
'setFetchSize#'メソッドはヒントになっています。 JDBCドライバを使用するか無視するかは、JDBCドライバに完全に依存しています。また、 '誰がDBを呼び出しますか? ' - >ドライバがそれを行います。この[SO Q/A](http://stackoverflow.com/questions/1318354/what-does-statement-setfetchsizensize-method-really-do-in-sql-server-jdbc-driv)からそのほとんどを得ました –
OCIドライバの場合、各OCIコールごとのネットワーク・ラウンドトリップの量を記述するセクションがドキュメントにあります。 JDBCドライバーは、この方法では文書化されていません。より高レベルのAPIを提供します。ただし、OCIドキュメントをトピックの紹介として使用できます。 – ibre5041