您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

MySQL ResultSet可滚动/可更新无法按预期工作

MySQL ResultSet可滚动/可更新无法按预期工作

正如马克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: 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
MySQL 2022/1/1 18:17:02 有638人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶