【发布时间】:2016-01-19 10:37:32
【问题描述】:
互联网上有很多关于使用 JDBC 分页/迭代巨大结果集的教程。 所以,到目前为止,我基本上找到了许多方法:
- Vendor specific sql
- 可滚动的结果集 (?)
- 将纯结果集保存在内存中并仅在必要时映射行(使用 fetchSize)
结果集获取大小,或者显式设置,或者默认等于 到传递给它的语句获取大小,确定 在任何后续行程中检索到的行数 该结果集的数据库。这包括任何仍在 需要完成原始查询,以及任何重新获取 数据到结果集中。可以显式或重新获取数据 隐式地,更新滚动敏感或 滚动不敏感/可更新的结果集。
- 光标 (?)
- Custom seek method paging implemented by jooq
很抱歉搞砸了所有这些,但我需要有人帮我解决这个问题。 我有一个简单的任务,服务使用者要求使用 pageNumber 和 pageSize 的结果。看起来我有两个选择:
- 使用供应商特定的 sql
- 将连接/语句/结果集保存在内存中,依赖jdbc fetchSize
在后一种情况下,我使用rxJava-jdbc,如果您查看producer implementation,它保存了结果集,那么您所做的就是调用 request(long n) 并处理另外的 n 行。当然,一切都隐藏在 rxJava 的 Observable sugar 下。我不喜欢这种方法的是,您必须在不同的服务调用之间保存结果集,并且如果客户端忘记耗尽或关闭它,则必须清除该结果集。 (注意:这里的resultSet是java ResultSet类,不是实际数据)
那么,推荐的分页方式是什么?与保持连接相比,供应商特定的 sql 是否被认为慢?
我正在使用 oracle,不建议将 ScrollableResultSet 用于大型结果集,因为它会在客户端缓存整个结果集数据。 proof
【问题讨论】:
标签: java oracle jdbc pagination