yaw*_*awn 19 java oracle spring jdbc
当使用各种JDBC模板方法之一时,我对如何迭代/滚动大型结果集(不适合内存)感到困惑.即使没有直接暴露Iterable接口,我至少也会期望在查询执行时调用RowCallbackHandler的实例,而不是在它完成之后(或堆overfloats).
我确实看过这个(虽然在精神上类似于这篇关于堆栈溢出的帖子,但我没有改变任何内容)和春季论坛中的这篇文章.后者似乎建议在游标获取数据时确实应该调用回调处理程序.然而,我的测试显示没有这样的行为
该数据库是Oracle10g.我使用的是11.1.0.7.0-Production驱动程序和Spring 2.5.6.SEC01.任何人都想知道如何迭代结果集,最好是保持RowMapper等的映射逻辑?
ska*_*man 20
Oracle JDBC驱动程序对setFetchSize()方法有适当的支持java.sql.Statement,允许您控制驱动程序一次获取的行数.
但是,RowMapper正如Spring所使用的那样,通过将每行读入内存,RowMapper将其转换为对象,并将每行的对象存储在一个大列表中.如果结果集很大,那么无论JDBC如何获取行数据,此列表都会变大.
如果需要处理大型结果集,则RowMapper不可扩展.您可以考虑使用RowCallbackHandlerJdbcTemplate上的相应方法.RowCallbackHandler没有规定结果的存储方式,由你来存储它们.
这是驱动程序/连接的一个属性,是否将数据流式传输回给您,或者是否将其以一个块的形式发送回。例如,在 SQL Server 中,您可以SelectMethod在连接 URL 上使用该属性:
jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct
的值direct意味着结果应该一次性得出。另一个选择是cursor,它允许您指定希望连接将结果流式传输回给您。恐怕我不确定Oracle数据源的模拟是什么
这RowCallbackHandler当然对我有用。
您可以使用springjdbc-iterable库:
CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);
Run Code Online (Sandbox Code Playgroud)
迭代器将在耗尽时自动关闭,或者可以手动关闭.它只能在事务范围内工作.
免责声明:我写了这个库
| 归档时间: |
|
| 查看次数: |
19146 次 |
| 最近记录: |