代码之家  ›  专栏  ›  技术社区  ›  pm_labs

在jdbc/ibatis 3中迭代一个大型结果集的最佳方法是什么?

  •  1
  • pm_labs  · 技术社区  · 15 年前

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

    • 结果将按序列ID排序,序列ID更改时将创建新对象。创建的对象将被发送到外部服务,有时在发送另一个对象之前必须等待(这意味着不会立即使用下一组数据)
    • 我们已经在iBATIS3中投入了代码,因此iBATIS解决方案将是对我们最好的方法(我们已经尝试过使用rowbounds,但还没有看到它如何在幕后进行迭代)。
    • 我们希望在最小化内存使用和减少数据库访问次数之间取得平衡。
    • 我们也对纯jdbc方法开放,但是我们希望解决方案能够在不同的数据库上工作。

    更新1 :

    • 我们需要尽可能少地调用数据库(1个调用是理想的场景),同时还要防止应用程序使用太多内存。对于这种类型的问题有没有其他的解决方案?可能是纯jdbc还是其他技术?

    更新2

    • 查询将是后端驱动的,并且在给定时间内只执行一个实例。

    谢谢,希望能听到你对此的见解。

    2 回复  |  直到 15 年前
        1
  •  0
  •   leonbloy    15 年前

    看来你需要某种 分页 . iBATIS通过查询中的标准限制/偏移参数(以及iBATIS3中的行边界)来实现这一点。

    但似乎(如果我做得对的话)您也在使用ibatis的group by特性,这样一个select返回n个记录,其中有n1个distint“idx”字段,结果创建了n1个“parent”对象,每个都有几个子对象(总共创建了n个子对象)。或者类似的事情。

    不幸的是(而且可以理解)这两件事 do not mix well .

    我在这里看不到什么灵丹妙药,人们可以想到很多方法,每种方法都有缺点——没有更多的信息很难评估。

    如果主要对象是“大的”(许多记录),并且每个对象都将被单独处理(通过访问远程服务器),那么您甚至可能需要进行特殊分页,每页一个对象,在内部记住先前读取的id(类似于 SELECT ... FROM ... WHERE id = (SELECT MIN(id) FROM .... WHERE id > #lastid# )

        2
  •  1
  •   Jim Ferrans    15 年前

    我们需要尽可能少地调用数据库(1个调用是理想的场景),同时还要防止应用程序使用太多内存。对于这种类型的问题有没有其他的解决方案?可能是纯jdbc还是其他技术?

    你真的不应该担心数据库调用的数量。只需直接查询最终用户需要立即查看的数据。这是再有效不过的了。谷歌也不会查询整个数据库,只显示前10个。不,它查询的正是这10个显示,没有少或多。这比将整个数据库拖入/复制到应用程序的内存并处理它要快得多,效率也更高。利用rdbms的强大功能。这就是它的发明/意图。