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

2024-04-09

当从选择查询返回结果时,ResultSet 是否将所有行存储在内存中?或者它只获取有限数量的行?数据库与数据库之间有区别吗? MYSQL 的行为是什么?


默认情况下,MySQL JDBC 驱动程序会尝试获取 Java 内存中的所有内容。因此,如果您正在处理非常多的行和/或很少的内存,那么您需要告诉它不要这样做。这在中详细描述了其 JDBC 驱动程序文档 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html。以下是相关性的摘录:

结果集

默认情况下,ResultSets 被完全检索并存储在内存中。在大多数情况下这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现。如果您正在使用具有大量行或较大值的结果集,并且无法在 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 驱动程序),您必须查阅其文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐