【问题标题】:Iterating over JDBC Resultset object遍历 JDBC 结果集对象
【发布时间】:2016-10-12 03:40:03
【问题描述】:

在一个 Java 程序中,我使用了一个复杂的查询(一个包含内部连接和子查询的选择子句)。我正在迭代结果集并将输出写入文本文件。

Select 子句输出可以是 400,000 条记录。如果结果集有这么多记录,会不会引起任何问题? ResultSet 是否有一些记录/内存限制?

【问题讨论】:

  • 您使用的是哪个数据库;结果集行为因数据库/驱动程序和使用的结果集并发性而异。
  • 您需要全部 400,000 条记录吗?如果没有,请缩小您在 WHERE 子句中的选择范围,以便只选择您真正需要的记录。

标签: java database jdbc


【解决方案1】:

ResultSet 本身是未绑定的。但是,您的 JVM 进程和网络功能有限制。如果您需要处理来自一个查询的大量记录,请尝试使用可用的 ResultSet 选项:

Statement stmt = con.createStatement("select * from dual", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(1000);

根据您的数据库和/或驱动程序供应商,这些可以帮助您以更少的内存占用更快地处理请求。

【讨论】:

  • 将获取大小设置得更大会更快,但会占用更多内存。这只是内存和数据库往返之间的权衡
  • @AdrianShum 好吧,对于某些驱动程序,这实际上可能会触发将请求的数据集拆分为更小的部分,然后将它们一一发送给您,而不是一次推送整个结果集。但我同意你的看法,应该明智地选择获取大小。
  • 好吧,我无法想象在任何情况下设置为 更大 获取大小会使驱动程序将数据拆分为 更小 块。获取大小的全部目的是告诉驱动程序准备缓冲区以检索提供的记录数,如果结果证明它变小就没有意义。而且,这只是一个常识:如果您一次获取更多内容,则会减少往返次数,但需要更多内存。让事情变得更小不会减少往返次数。
  • 当然,如果你比较一个巨大的 fetch 大小和一个相当小的大小的 fetch 大小,较小的大小可能需要更少的时间,但这仅仅是因为巨大的缓冲区造成的开销导致缓慢。而且,在您的示例中设置为 1000 很少是一个合理的数字,除非您要处理非常大量的记录。通常“大”获取大小的范围在 20-100 左右
  • @AdrianShum 不获取大小默认值完全取决于驱动程序实现?我实际上还没有准备好就这个话题争论,因为我们还不知道数据库供应商。
猜你喜欢
  • 2023-02-15
  • 2011-11-30
  • 2017-10-23
  • 2019-02-18
  • 2020-07-12
  • 2014-09-30
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多