2010-02-04 122 views
1

我在使用Spring Jdbc从数据库中检索数据时遇到了问题。这是我的问题:spring jdbc RowCallbackHandler噩梦

我在我的DAO上有一个getData()方法,它应该从某些select语句的结果返回一行。当再次调用时,getData()方法应该以类似FIFO的方式返回第二行。我的目标是一次只能在记忆中获得一个结果,因为我的表将在未来获得巨大的潜力,并将所有内容都带入记忆中,这将是一场灾难。

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

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

回答

1

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

问题如果Spring Jdbc能够在我的OP中提到的行为是,但是,仍然在空气中。如果任何人有这个问题的答案,我相信它会帮助其他人。

干杯!

1

您可以采取不同的方法。创建一个查询,它将只返回您想要读取的行的ID。将这些ID保存在内存中。你真的需要拥有庞大的数据集才能消耗大量的内存。遍历它并逐个加载由其ID引用的行。

1

JdbcTemplate.setFetchSize(int fetchSize)

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

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

+0

难道这仍然试图组装一个列表与结果集中的所有数据?我仍然无法承受这种记忆。 – 2010-02-04 13:21:05

+0

不,根据您的数据库,它将使用适合限制结果集的子句。 (例如MySQL - limit,Oracle - rownum等) 嗯 - 我现在不确定。有了Hibernate,我知道这是可能的,但纯粹的春天我不确定。 – BacMan 2010-02-04 15:22:07