从SimpleJdbcTemplate查询返回的大型列表

Jea*_*art 9 java sql spring jdbc spring-jdbc

这是我的问题:在我的Java程序中的某个时刻,我使用Spring的SimpleJdbcTemplate类从数据库中获取(非常)大的事件列表.

List<Event> events = 
            this.simpleJdbcTemplate.query(myQuery,
            myMapper(), 
            new Object[] {
                    filter.getFirst(),
                    filter.getSecond(),
                    filter.getThird()}
            );
Run Code Online (Sandbox Code Playgroud)

问题是该列表可能包含600,000个事件...因此使用大量内存(并且还需要时间来处理).

但是我并不需要一次检索所有事件.实际上我希望能够遍历列表,只读取一些事件(链接到特定的KEY_ID - sq查询myQuery按KEY_ID排序),处理它们并最终返回迭代,让垃圾收集器摆脱以前和已处理的事件,以便我永远不会超过一定的内存量.

有没有一种很好的方法可以使用Spring库(或任何库)?

干杯,Vakimshaar.

Nat*_*hes 5

我认为你的问题的一部分是你的查询一次性执行,你得到的结果集很大,占用了内存和网络带宽.除了需要一种迭代结果集的方法之外,您还需要一种方法来逐步从数据库中获取结果.看看这个关于延迟加载结果集的答案.看起来您可以结合使用ResultSetExtractor设置获取大小,并可能获得所需的行为(取决于数据库).


JB *_*zet 2

如果我理解正确,您希望迭代结果集,但对构建完整的结果列表不感兴趣。

只需使用带有ResultSetExtractoras 参数的查询方法即可。可以ResultSetExtractor使用映射器将当前行转换为Event. 将每个事件放入列表中,直到到达不同的 KEY_ID 或结果集末尾,然后继续处理事件列表并清除列表。