在JDBC / iBatis 3中迭代大型结果集的最佳方法是什么?

时间:2010-04-27 10:28:22

标签: java jdbc ibatis

我们试图从数据库中迭代大量的行并将它们转换为对象。行为如下:

  • 结果将按序列id排序,当序列ID更改时,将创建一个新对象。创建的对象将被发送到外部服务,有时必须等待再发送一个(这意味着下一组数据不会立即使用)
  • 我们已经在iBatis 3中投入了代码,因此iBatis解决方案对我们来说是最好的方法(我们已经尝试过使用RowBounds,但还没有看到它是如何进行迭代的。)
  • 我们希望平衡最小化内存使用量并减少数据库访问次数。
  • 我们也对纯JDBC方法持开放态度,但我们希望该解决方案适用于不同的数据库。

更新1

  • 我们需要尽可能少地调用DB(1次调用是理想的情况),同时还要防止应用程序使用太多内存。对于这类问题,还有其他解决方案可能是纯JDBC还是其他任何技术?

更新2

  • 查询将被后端驱动,并且在给定时间只执行1个实例。

感谢并希望听到您对此的见解。

2 个答案:

答案 0 :(得分:1)

  

我们需要尽可能少地调用DB(1次调用将是理想的情况),同时还要阻止应用程序使用太多内存。对于这类问题,还有其他解决方案可能是纯JDBC还是其他任何技术?

你真的不应该担心数据库调用量。只需查询最终用户需要立即查看的数据。它不能更有效地完成。谷歌也不会查询整个数据库只显示前10个。不,它只查询那10个显示,没有更少或更多。这比将整个数据库拖入/复制到应用程序的内存并进行处理更加快速和高效。利用RDBMS的强大功能。这就是它的发明之处。

答案 1 :(得分:0)

您似乎需要某种分页。 iBatis通过查询中的标准LIMIT / OFFSET参数(以及iBatis 3中的RowBounds)来实现这一点。

但似乎(如果我说得对)你也正在使用iBatis的GROUP BY功能,因此选择返回带有N1 distint“idx”字段的N条记录会导致创建N1个“父”对象一个有几个子对象(总共创建了N个子对象)。或类似的东西。

不幸(并且可以理解)这两件事do not mix well

我不会在这里看到任何银弹,人们可以想到许多方法,每种方法都有其缺点 - 如果没有更多信息,很难评估。

如果主要对象是“大”(许多记录)并且每个对象将被单独处理(跳转到远程服务器),您甚至可能想要进行临时分页,每页有一个对象,记住内部优先读取ID(类似SELECT ... FROM ... WHERE id = (SELECT MIN(id) FROM .... WHERE id > #lastid#))