JDBC 结果集是否在 SQL 查询的一次网络调用中获取所有数据?考虑查询select * from table where timestamp > 1597937895
。现在该查询有超过 100 万行。结果集是否在一次网络调用中获取所有行?或者当读取结果集时它是否会获取一批行?因为我还需要查看内存使用情况。因此澄清一下。我知道 ResultSet 在一次网络调用中获取所有数据。这是唯一的行为还是有其他方法告诉结果集批量获取数据?
获取行和批处理的确切行为因数据库系统和驱动程序而异。有些将始终批处理,有些将 - 默认情况下 - 一次获取所有行,而有些则取决于结果集类型或其他因素。
默认情况下,MySQL Connector/J 驱动程序将在执行时获取内存中的所有行。可以使用批量大小将其更改为行流式传输或基于游标的提取,如文档中所述JDBC API 实现说明 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-implementation-notes.html under 结果集:
默认情况下,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
充当驱动程序进行流传输的信号
逐行结果集。此后,使用创建的任何结果集
语句将被逐行检索。
[..但请阅读警告..]
另一种选择是使用基于游标的流来检索集合
每次的行数。这可以通过设置连接来完成
财产useCursorFetch
为 true,然后调用setFetchSize(int)
with int
是每次要获取的所需行数:
conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
stmt = conn.createStatement();
stmt.setFetchSize(100);
rs = stmt.executeQuery("SELECT * FROM your_table_here");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)