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

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

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

结果集

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

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

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

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

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

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

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

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

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

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

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

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