加载SELECT查询的实际数据块(不再执行相同的查询)

问题描述:

假设,如果我执行一个select查询(HQL)并且它给出100K行作为结果。我想知道是否有一种方法来加载Java(或任何其他语言)这些100K的块在1K块查询完成后执行。 我把它分成大块的原因是 - 我不知道这些100K结果将存储在哪里,而我正在用java处理它们。但我想使用较少的内存消耗。加载SELECT查询的实际数据块(不再执行相同的查询)

  1. 执行查询(与HQL休眠条件)(假设100K行结果)
  2. 挑第一1K在它们(而不JVM的存储器或某处加载其他99K,如迟缓装载在休眠
  3. 过程
  4. 从(2)
拾取下一个1K
  • 重复

    更新 - 我不想再次点击查询。 要么我无法理解任何答案,要么你的人无法理解我的问题

  • +0

    网上有一些很好的参考资料,比如[this one](http://www.numerati.com/2012/06/26/reading-large-result-sets-with-hibernate-and-mysql /)。 –

    +0

    我相信你的意思是说,每当我需要结果时,用下一个计数器打数据库? – user3104225

    +0

    我的意思是,如果有一种方法来打击查询,然后得到结果(主键)的指针。并使用这些指针获得下一组结果(实际数据)。 – user3104225

    首先在两个查询中拆分您的查询。

    第一个是通过将Select部分更改为类似于SELECT COUNT(o) FROM Object o的东西来获得结果集的计数。

    发送是你现有的查询没有变化。

    然后首先运行计数查询请求一个结果。它将直接是Long值与结果大小。

    然后计算出你迭代:

    long pages = Math.ceil(count/1000); 
    

    最后但并非最不重要迭代计算页面,并通过启动你的查询设定偏移,并得到结果之前限制。

    +0

    '首先在两个查询中拆分您的查询。'但是如果两个查询之间的数据库发生变化会发生什么? –

    +0

    这也可能发生在你没有分页的情况下工作在100k记录的时间;) –

    +0

    把所有的包装方法,调用他自我递归,直到它发现db中没有任何更改 –