假设我必须浏览所有条目。有谁知道如何获取 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
行。
慕田峪7331174
TA贡献1828条经验 获得超13个赞
取决于数据库引擎和 JDBC 驱动程序。通常,JDBC API 背后的想法是数据库引擎创建一个游标(这也是为什么 ResultSet 是必须关闭的资源的原因),因此,您可以在SELECT * FROM someTableWithBillionsOfRows
没有 a 的情况下执行 a LIMIT
,但它可以很快。
是否真的如此,好吧,这取决于。根据我的经验,它主要与 postgres 交互,它很快(例如,基于游标的数据从 DB 到 VM 的传输有限,即使查询匹配数十亿行),因此你的计划(无限制选择,继续调用接下来直到你有你想要的然后关闭结果集)应该可以正常工作。
NB:一些数据库引擎半途而废并批量传输结果,两全其美:延迟开销是有限的(单个延迟开销由批量结果共享),但 DB 和 VM 之间的总传输仅限于rowsize 乘以 batchsize,即使您只读取一行然后关闭结果集。
添加回答
举报
0/150
提交
取消