当使用各种 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/