Mark Rotteveelが質問へのコメントで言及しているように、MySQLはデフォルトでResultSetデータをキャッシュします(Ben J. Christensen ここ )。このキャッシングの明らかな副作用は、MySQL Connector/JがTYPE_FORWARD_ONLYResultSetを実際にスクロール可能に「アップグレード」することです。
Statement s = dbConnection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = s.executeQuery("SELECT * FROM testdata");
rs.last();
System.out.println(String.format("Current row number: %d", rs.getRow()));
rs.previous();
System.out.println(String.format("Current row number: %d", rs.getRow()));
ディスプレイ
Current row number: 3
Current row number: 2
上記のブログ記事によると、ResultSetデータのキャッシュと「ストリーミング」を防ぐ方法は、Statement.setFetchSize
を使用することです。 :
Statement s = dbConnection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
s.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = s.executeQuery("SELECT * FROM testdata");
rs.next();
System.out.println("Data from first row: " + rs.getString(2));
System.out.println("now let's try rs.last() ...");
try {
rs.last();
System.out.println("... Okay, done.");
} catch (Exception e) {
System.out.println("... Exception: " + e.getMessage());
}
結果として
Data from first row: Gord
now let's try rs.last() ...
... Exception: Operation not supported for streaming result sets