春天JDBC支持和大型数据集(Spring JDBC support and large datas

2019-07-03 21:38发布

当使用的各种JDBC模板的方法之一,我对如何遍历大结果集/滚动(这将不适合到内存)混淆。 即使没有可迭代接口的直接暴露我至少希望RowCallbackHandler的情况下,而它的结束后(或堆overfloats)执行查询时不被调用。

我也有在看一个这个 (这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在春天论坛。 后者似乎表明回调处理器确实应该得到所谓当光标获取数据。 但是我的测试显示没有这样的行为。

该数据库是Oracle10g中。 我现在用的是11.1.0.7.0生产驱动器和弹簧2.5.6.SEC01。 任何想法任何人如何遍历结果集,优选地,同时保持的RowMapper等的映射逻辑?

Answer 1:

Oracle JDBC驱动程序有适当的支持setFetchSize()的方法java.sql.Statement ,它允许您控制多少行的驱动程序将在一个去取。

然而, RowMapper 13759春天的作品通过读取每一行到内存中,得到RowMapper把它翻译成一个对象,并存储一个大名单的每一行的对象。 如果您的结果集是巨大的,那么这个名单会得到很大的,不管如何JDBC获取行数据。

如果您需要处理大的结果集,然后RowMapper的不是可扩展的。 您可以考虑使用RowCallbackHandler相反,与JdbcTemplate的相应方法一起。 RowCallbackHandler没有规定,结果是如何存储,留给了你存储它们。



Answer 2:

您可以使用springjdbc-迭代库:

CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper);

迭代器将自动关闭,在耗尽或者可以手动关闭。 这将交易范围内才能正常工作。

免责声明:我写这个库



Answer 3:

这是驱动器/连接是否流数据回你还是把它发回一个块的属性。 例如,在SQL Server中,您使用SelectMethod上的连接URL属性:

jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct

direct的结果应该来一气呵成手段。 另一个选择是cursor ,它允许您指定要连接到流结果反馈给你。 我不知道对于Oracle数据源的模拟是什么,我怕

RowCallbackHandler肯定对我的作品。



Answer 4:

  1. 创建延伸的自定义存储过程StoredProcedure
  2. 创建RowCallBackHandler ,可以同时处理每一行,一个。
  3. 声明你的参数。 如果你有一个结果集,首先声明一个。 使用SqlReturnResultSet类和使用您创建RowCallBackHandler
  4. 声明任何其他参数
  5. 我做的步骤2至5在我的客户的存储过程的构造
  6. 创建地图包含您的输入参数
  7. 与输入参数执行存储过程

我将提供代码,但下面的文章包含了所有的信息。

调用与Spring JDBC模板存储过程



Answer 5:

这里是拉的Java SQL结果集所有到内存中一个好的图书馆。

http://casperdatasets.googlecode.com

您可以滚动/通过迭代数据集,你可以发出查询反对,并建立索引优化。 它也实现了java.sql.ResultSet接口,所以你可以继续从该数据集minimals chnages到JDBC代码的结果进行操作。



文章来源: Spring JDBC support and large dataset