ResultSet是将所有数据加载到内存中还是仅在请求时加载?

tth*_*tth 34 java database jdbc

我有一个.jsp页面,我有一个显示Oracle数据库记录的GUI表.该表允许典型的分页行为,例如"FIRST","NEXT","PREVIOUS"和"LAST".记录是从执行SQL语句返回的Java ResultSet对象中获取的.

这个ResultSet可能非常大,所以我的问题是:

如果我有一个包含一百万条记录的ResultSet但我的表只显示ResultSet中前十条记录中的数据,那么只有当我开始请求记录数据时才会获取数据,或者一旦ResultSet将所有数据完全加载到内存中从执行SQL语句返回?

Chr*_*ail 41

Java ResultSet是数据库中结果的指针(或游标).ResultSet从数据库中加载块中的记录.因此,要回答您的问题,数据仅在您请求时以块为单位提取.

如果需要控制驱动程序一次获取多少行,则可以在ResultSet上使用setFetchSize()方法.这将允许您控制一次检索的块的大小.

  • 获取大小基本上是对驱动程序"建议"在给定时间要获取多少记录,并且由驱动程序决定是使用建议的大小还是忽略它.我想大多数精心设计的司机都会使用它.jTDS(对于SQL Server)使用它. (4认同)

Jos*_*hua 11

JDBC规范未指定数据是否已流式传输或是否已加载到内存中.默认情况下是Oracle流.MySQL没有.要让MySQL流式传输结果集,您需要在Statement上设置以下内容:

    pstmt = conn.prepareStatement(
        sql,
        ResultSet.TYPE_FORWARD_ONLY,
        ResultSet.CONCUR_READ_ONLY);
    pstmt.setFetchSize(Integer.MIN_VALUE);
Run Code Online (Sandbox Code Playgroud)