Như Mark Rotteveel đề cập trong một nhận xét cho câu hỏi, MySQL lưu trữ dữ liệu ResultSet theo mặc định (cũng được thảo luận trong một bài báo trên blog của Ben J. Christensen tại đây ). Một tác dụng phụ rõ ràng của bộ nhớ đệm này là MySQL Connector / J sẽ "nâng cấp" TYPE_FORWARD_ONLY ResultSet để thực sự có thể cuộn được:
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()));
hiển thị
Current row number: 3
Current row number: 2
Theo bài viết blog được trích dẫn ở trên, cách để ngăn chặn bộ nhớ đệm và "truyền trực tuyến" dữ liệu ResultSet là sử dụng 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());
}
dẫn đến
Data from first row: Gord
now let's try rs.last() ...
... Exception: Operation not supported for streaming result sets