为了账号安全,请及时绑定邮箱和手机立即绑定

ResultSet 实现 - 它是在调用 next() 时获取的,还是结果已经在内存中?

ResultSet 实现 - 它是在调用 next() 时获取的,还是结果已经在内存中?

偶然的你 2022-07-27 19:57:18
假设我必须浏览所有条目。有谁知道如何获取 ResultSet 的结果?我可以调用SELECT * FROM MyTable而不是SELECT TOP 100 * FROM MyTable ORDER BY id ASC OFFSET 0;调用,只是resultSet.next()根据需要调用来获取结果,并在程序级别处理它们,还是结果已经在内存中而不是放入TOP是不好的?
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

该类ResultSet公开了一个

void setFetchSize(int rows)

方法,根据JavaDoc

ResultSet 当此对象需要更多行时,向 JDBC 驱动程序提供有关应从数据库中获取的行数的提示。

这意味着如果我们有一个200来自数据库的行结果集,并且我们将 fetch size 设置为100~100则一次将从数据库加载行,并且可能需要两次访问数据库。

默认提取大小取决于驱动程序,但例如,Oracle将其设置为10行。


查看完整回答
反对 回复 2022-07-27
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

取决于数据库引擎和 JDBC 驱动程序。通常,JDBC API 背后的想法是数据库引擎创建一个游标(这也是为什么 ResultSet 是必须关闭的资源的原因),因此,您可以在SELECT * FROM someTableWithBillionsOfRows没有 a 的情况下执行 a LIMIT,但它可以很快。

是否真的如此,好吧,这取决于。根据我的经验,它主要与 postgres 交互,它很快(例如,基于游标的数据从 DB 到 VM 的传输有限,即使查询匹配数十亿行),因此你的计划(无限制选择,继续调用接下来直到你有你想要的然后关闭结果集)应该可以正常工作。

NB:一些数据库引擎半途而废并批量传输结果,两全其美:延迟开销是有限的(单个延迟开销由批量结果共享),但 DB 和 VM 之间的总传输仅限于rowsize 乘以 batchsize,即使您只读取一行然后关闭结果集。


查看完整回答
反对 回复 2022-07-27
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信