java - Spring JDBC 支持和大型数据集

标签 java oracle spring jdbc

当使用各种 JDBC 模板方法之一时,我对如何迭代/滚动大型结果集(不适合内存)感到困惑。即使没有直接暴露 Iterable 接口(interface),我至少希望 RowCallbackHandler 的实例被调用查询正在执行而不是在它完成后(或堆溢出)。

我确实看过 this (尽管在精神上与 this post 相似,但对我来说没有任何改变)和 this在 Spring 论坛发帖。后者似乎表明回调处理程序确实应该在游标获取数据时被调用。然而,我的测试没有显示出这样的行为。

数据库是Oracle10g。我正在使用 11.1.0.7.0-Production 驱动程序和 Spring 2.5.6.SEC01。任何人都知道如何迭代结果集,最好同时保留 RowMapper 等的映射逻辑?

最佳答案

Oracle JDBC 驱动程序对 java.sql.Statement 上的 setFetchSize() 方法具有适当的支持,它允许您控制驱动程序将获取多少行一口气。

然而,Spring 使用的 RowMapper 的工作方式是将每一行读入内存,让 RowMapper 将其转换为一个对象,并将每一行的对象存储在一个大文件中列表。如果您的结果集很大,那么无论 JDBC 如何获取行数据,此列表都会变大。

如果您需要处理大型结果集,则 RowMapper 不可扩展。您可以考虑改用 RowCallbackHandler 以及 JdbcTemplate 上的相应方法。 RowCallbackHandler 并不规定结果的存储方式,由您自己决定。

关于java - Spring JDBC 支持和大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341254/

相关文章:

spring - 如何在 jetty 9 中禁用基于 JSESSIONID cookie(和任何其他)的 session 跟踪功能?

java - 找不到名称为 'runtime' 的 org.springframework.boot 配置

java - Codenameone 上的 YouTube 播放器

java - 使用 Google Cloud 对本地 Spring Boot 服务进行身份验证

sql - 在 Oracle SQL Developer 中恢复未保存的 SQL 查询脚本

java - 如何将 org. Threeten.bp 库中的 OffsetDateTime 插入 db Oracle 列

java - 对具有许多相等值的数组进行排序java

Java对象不能通过递归通过ref传递

sql - 最好的 Oracle SQL 查询分析工具

JavaScript + Spring MVC - 如何从 Controller 发送的对象获取值?