spring jdbc RowCallbackHandler的噩梦

问题描述 投票:1回答:4

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

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

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

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

java spring jdbc
4个回答
1
投票

JdbcTemplate.setFetchSize(int fetchSize)

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

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


1
投票

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

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

干杯!


0
投票

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


0
投票

我们遇到同样的问题: - 在原始jdbc中测试获取fetchSize记录Preparestatement工作正常:在获取记录的fetchSize后停止Db时,在resultset.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。回调记录处理程序仍然可以无错误地处理其余记录。

© www.soinside.com 2019 - 2024. All rights reserved.