正如马克Rotteveel到问题的评论中提到,MySQL的高速缓存默认的ResultSet数据(也由Ben J.
Christensen的一篇博客文章中讨论这里)。这种缓存的明显副作用是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: 3Current 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: Gordnow let's try rs.last() ...... Exception: Operation not supported for streaming result sets



