Spring JDBC支持和大型数据集
问题内容:
当使用各种JDBC模板方法之一时,我对如何迭代/滚动大结果集(不适合内存)感到困惑。即使没有直接公开Iterable接口,我至少也希望RowQuerybackHandler实例在查询执行后(
而 不是在堆溢出之后)执行时被调用。
我也有在看一个这个(这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在spring论坛。后者似乎暗示在游标获取数据时确实应该调用回调处理程序。但是,我的测试没有显示这种行为。
该数据库是Oracle10g。我正在使用11.1.0.7.0-Production驱动程序和Spring
2.5.6.SEC01。有什么想法可以迭代结果集吗?最好在保持RowMapper等映射逻辑的同时?
问题答案:
Oracle
JDBC驱动程序对上的setFetchSize()
方法具有适当的支持,该方法java.sql.Statement
可让您控制驱动程序一次性读取多少行。
但是,RowMapper
Spring使用的方法是将每一行读入内存,将其RowMapper
转换为一个对象,并将每一行的对象存储在一个大列表中。如果结果集很大,则无论JDBC如何获取行数据,此列表都会很大。
如果您需要处理大型结果集,则RowMapper无法缩放。您可以考虑RowCallbackHandler
改为使用JdbcTemplate上的相应方法。RowCallbackHandler
并不决定结果的存储方式,而是由您来存储结果。