spring jdbc RowCallbackHandler的噩梦

时间:2010-02-04 12:40:56

标签: java spring jdbc

我在使用Spring Jdbc从数据库中检索数据时遇到问题。这是我的问题:

我的DAO上有一个getData()方法,它应该从某些select语句的结果中返回一行。再次调用时,getData()方法应以类似FIFO的方式返回第二行。我的目标是一次只有一个内存结果,因为我的桌子将来可能会变得很大并且把所有东西都带到内存中会是一场灾难。

如果我使用带有结果集的常规jdbc代码,我可以将其获取大小设置为1,一切都会好的。但是我最近发现通过JdbcTemplate对象的Spring Jdbc操作不允许我实现这样的行为(据我所知......我对Spring框架的功能并不是很了解)。我听说过RowCallbackHandler接口,并且java牧场中的this帖子说我可以以某种方式暴露结果集以便稍后使用(尽管使用这种方法它会将结果集存储多次,因为有行,这是非常愚蠢的。)

我一直在玩实现RowCallbackHandler接口一天,我仍然找不到让它一次从我的select中检索一行的方法。如果有人能在这件事上给我启发,我会非常感激。

4 个答案:

答案 0 :(得分:1)

JdbcTemplate.setFetchSize(int fetchSize)

  

设置此JdbcTemplate的获取大小。这对于处理大型结果集很重要:将其设置为高于默认值将以内存消耗为代价提高处理速度;将此值设置得较低可以避免传输应用程序永远不会读取的行数据。

     

默认值为0,表示使用JDBC驱动程序的默认值。

答案 1 :(得分:1)

经过大量搜索和咨询我的团队其他成员后,我们得出的结论是,这不是我们项目的最佳实施路径。正如鲍里斯所说,不同的方法是要走的路。但是,我正在做一些不同的事情,而是使用SimpleJdbcTemplate并拆分我的查询,以便它更好地适应内存。我的记录表中​​的“状态”字段将负责判断记录是否已成功处理或读取,因此我知道接下来要记录的记录。

Spring Jdbc能否解决我在OP中提到的行为的问题仍然存在。如果有人对这个问题有答案,我相信它会帮助其他人。

干杯!

答案 2 :(得分:0)

您可以采取不同的方法。创建一个查询,该查询将仅返回您要读取的行的ID。将此ID集合保留在内存中。你真的需要拥有庞大的数据集以消耗大量内存。迭代它并逐个加载由其ID引用的行。

答案 3 :(得分:0)

我们有同样的问题:  -测试在原始jdbc中获取fetchSize记录的测试效果很好:在获取记录的fetchSize后停止Db时,运行resultet.next()时,错误抛出是Jdbc Connection。  -使用JdbcTemplate测试fetchSize:

PreparedStatementSetter preparedStatementSetter = ps -> { ps.setFetchSize(_exportParams.getFetchSize()); };
RowCallbackHandler rowCallbackHandler = _rs -> { //do st here}
this.jdbcTemplate.query(_exportParams.getSqlscript(), preparedStatementSetter, rowCallbackHandler);

获得第一条记录后,我们停止了Postgres。回调记录处理程序仍然可以正确处理其余记录。