当使用的各种JDBC模板的方法之一,我对如何遍历大结果集/滚动(这将不适合到内存)混淆。 即使没有可迭代接口的直接暴露我至少希望RowCallbackHandler的情况下,而它的结束后(或堆overfloats)执行查询时不被调用。
我也有在看一个这个 (这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在春天论坛。 后者似乎表明回调处理器确实应该得到所谓当光标获取数据。 但是我的测试显示没有这样的行为。
该数据库是Oracle10g中。 我现在用的是11.1.0.7.0生产驱动器和弹簧2.5.6.SEC01。 任何想法任何人如何遍历结果集,优选地,同时保持的RowMapper等的映射逻辑?
Oracle JDBC驱动程序有适当的支持setFetchSize()
的方法java.sql.Statement
,它允许您控制多少行的驱动程序将在一个去取。
然而, RowMapper
13759春天的作品通过读取每一行到内存中,得到RowMapper
把它翻译成一个对象,并存储一个大名单的每一行的对象。 如果您的结果集是巨大的,那么这个名单会得到很大的,不管如何JDBC获取行数据。
如果您需要处理大的结果集,然后RowMapper的不是可扩展的。 您可以考虑使用RowCallbackHandler
相反,与JdbcTemplate的相应方法一起。 RowCallbackHandler
没有规定,结果是如何存储,留给了你存储它们。
您可以使用springjdbc-迭代库:
CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);
迭代器将自动关闭,在耗尽或者可以手动关闭。 这将交易范围内才能正常工作。
免责声明:我写这个库
这是驱动器/连接是否流数据回你还是把它发回一个块的属性。 例如,在SQL Server中,您使用SelectMethod
上的连接URL属性:
jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct
值direct
的结果应该来一气呵成手段。 另一个选择是cursor
,它允许您指定要连接到流结果反馈给你。 我不知道对于Oracle数据源的模拟是什么,我怕
在RowCallbackHandler
肯定对我的作品。
这里是拉的Java SQL结果集所有到内存中一个好的图书馆。
http://casperdatasets.googlecode.com
您可以滚动/通过迭代数据集,你可以发出查询反对,并建立索引优化。 它也实现了java.sql.ResultSet接口,所以你可以继续从该数据集minimals chnages到JDBC代码的结果进行操作。