MySQL数据库的ResultSet行为,是否将所有行存储在内存中?

时间:2011-03-01 16:41:59

标签: java mysql jdbc

从select查询返回结果时,ResultSet是否将所有行存储在内存中?或者它只获取有限数量的行?数据库与数据库有什么不同? MYSQL的行为是什么?

4 个答案:

答案 0 :(得分:3)

默认情况下,MySQL JDBC驱动程序尝试获取Java内存中的所有内容。因此,如果你处理的是非常多的行和/或很少的内存,那么你需要告诉它不要这样做。这在its JDBC driver documentation中有详细描述。以下是相关摘录:

  

结果集

     

默认情况下,ResultSet完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现。如果您正在使用具有大量行或大值的ResultSet,并且无法在JVM中为所需内存分配堆空间,则可以告诉驱动程序一次将结果流回一行。

     

要启用此功能,您需要以下列方式创建Statement实例:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
             java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
     

只读的只读结果集与提取大小Integer.MIN_VALUE的组合用作驱动程序逐行流式传输结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。

     

这种方法有一些警告。您必须先读取结果集中的所有行(或关闭它),然后才能在连接上发出任何其他查询,否则将抛出异常。

对于其他数据库(阅读:其他JDBC驱动程序),您必须查阅其文档。

答案 1 :(得分:1)

ResultSet不存储所有行,它会在数据库上保持游标打开。

一次获取的确切数据量取决于驱动程序(因此它在数据库与数据库之间存在差异)。

答案 2 :(得分:0)

如果大小不是很大,Resultset可能会存储所有数据。这取决于获取大小。 ResultSet setFetchSize只是一个提示,但它可以通过底层JDBC驱动程序来尊重提示。据我所知,oracle jdbc驱动程序确实尊重提示。

答案 3 :(得分:0)

通常,这没有指定,因此可能依赖于数据库(和JDBC驱动程序)。

一个始终保存内存中所有行的JDBC实现会产生非常大的结果,而单独获取每一行的实现性能会很差(至少,如果数据库位于远程的某个地方)。

因此,大多数实现以一些依赖于实现的大小的块来获取数据。我不知道任何MySQL JDBC驱动程序会做什么。