Seperti yang disebutkan Mark Rotteveel dalam komentar untuk pertanyaan, MySQL menyimpan data ResultSet secara default (juga dibahas dalam artikel blog olehBen J. Christensen di sini ). Efek samping yang jelas dari caching ini adalah MySQL Connector/J akan "meningkatkan" TYPE_FORWARD_ONLY ResultSet agar benar-benar dapat digulir:
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()));
menampilkan
Current row number: 3
Current row number: 2
Menurut artikel blog yang dikutip di atas, cara untuk mencegah caching dan "streaming" data ResultSet adalah dengan menggunakan 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());
}
mengakibatkan
Data from first row: Gord
now let's try rs.last() ...
... Exception: Operation not supported for streaming result sets