जैसा कि मार्क रोट्टेवेल ने प्रश्न पर एक टिप्पणी में उल्लेख किया है, MySQL डिफ़ॉल्ट रूप से परिणामसेट डेटा को कैश करता है (बेन जे। क्रिस्टेंसन द्वारा एक ब्लॉग लेख में भी चर्चा की गई है यहां ) इस कैशिंग का एक स्पष्ट दुष्परिणाम यह है कि MySQL Connector/J वास्तव में स्क्रॉल करने योग्य होने के लिए एक TYPE_FORWARD_ONLY ResultSet को "अपग्रेड" करेगा:
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
ऊपर उद्धृत ब्लॉग आलेख के अनुसार, कैशिंग को रोकने और परिणामसेट डेटा को "स्ट्रीम" करने का तरीका 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