Java spring jdbc RowCallbackHandler噩梦

Java spring jdbc RowCallbackHandler噩梦,java,spring,jdbc,Java,Spring,Jdbc,使用SpringJDBC从数据库检索数据时遇到问题。这是我的问题: 我的DAO上有一个getData()方法,它应该从某个select语句的结果返回一行。再次调用时,getData()方法应以类似FIFO的方式返回第二行。我的目标是一次只在内存中存储一个结果,因为我的表将来可能会变得很大,而将所有内容都存储在内存中将是一场灾难 如果我使用带有结果集的常规jdbc代码,我可以将其fetch size设置为1,一切都会很好。然而,我最近发现,通过JdbcTemplate对象执行的SpringJDBC

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

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

如果我使用带有结果集的常规jdbc代码,我可以将其fetch size设置为1,一切都会很好。然而,我最近发现,通过JdbcTemplate对象执行的SpringJDBC操作不允许我实现这样的行为(据我所知……我对Spring框架的特性并不十分了解)。我听说过RowCallbackHandler接口,java ranch中的post说我可以以某种方式公开结果集以供以后使用(尽管使用这种方法,它存储结果集的次数与存储行的次数相同,这相当愚蠢)


我已经玩了一天实现RowCallbackHandler接口,但仍然找不到一种方法让它一次从select中检索一行。如果有人能在这件事上启发我,我将不胜感激。

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

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

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


在与我的团队其他成员进行了大量搜索和咨询后,我们得出结论,这不是我们项目的最佳实施路径。正如鲍里斯所建议的那样,另一种方法是可行的。然而,我正在做一些不同的事情,而是使用SimpleJdbcTemplate并拆分查询,以便更好地适应内存。“我的记录”表中的“状态”字段将负责告知记录是否已成功处理或读取,以便我知道下一步要获取哪些记录

然而,SpringJDBC是否能够实现我在文章中提到的行为的问题仍然悬而未决。如果有人对这个问题有答案,我相信这会帮助其他人

干杯

我们有同样的问题: -在原始jdbc Preparestatement中测试获取fetchSize记录效果良好:在获取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);

在获得第一个记录后,我们停止了博士后。回调记录处理程序仍然可以处理剩余的记录而不会出错。

这不会仍然尝试用结果集中的所有数据组合一个列表吗?我仍然负担不起在内存中存储。不,根据您的数据库,它将使用一个适当的子句来限制结果集。(例如MySQL-limit、Oracle-rownum等)嗯,我现在还不确定。使用Hibernate,我知道这是可能的,但是纯Spring我不确定。每行执行一个查询?那效率很低