加载SELECT查询的实际数据块(不再执行相同的查询)
假设,如果我执行一个select查询(HQL)并且它给出100K行作为结果。我想知道是否有一种方法来加载Java(或任何其他语言)这些100K的块在1K块查询完成后执行。 我把它分成大块的原因是 - 我不知道这些100K结果将存储在哪里,而我正在用java处理它们。但我想使用较少的内存消耗。加载SELECT查询的实际数据块(不再执行相同的查询)
- 执行查询(与HQL休眠条件)(假设100K行结果)
- 挑第一1K在它们(而不JVM的存储器或某处加载其他99K,如迟缓装载在休眠)
- 过程
- 从(2)
更新 - 我不想再次点击查询。 要么我无法理解任何答案,要么你的人无法理解我的问题
首先在两个查询中拆分您的查询。
第一个是通过将Select部分更改为类似于SELECT COUNT(o) FROM Object o
的东西来获得结果集的计数。
发送是你现有的查询没有变化。
然后首先运行计数查询请求一个结果。它将直接是Long
值与结果大小。
然后计算出你迭代:
long pages = Math.ceil(count/1000);
最后但并非最不重要迭代计算页面,并通过启动你的查询设定偏移,并得到结果之前限制。
'首先在两个查询中拆分您的查询。'但是如果两个查询之间的数据库发生变化会发生什么? –
这也可能发生在你没有分页的情况下工作在100k记录的时间;) –
把所有的包装方法,调用他自我递归,直到它发现db中没有任何更改 –
网上有一些很好的参考资料,比如[this one](http://www.numerati.com/2012/06/26/reading-large-result-sets-with-hibernate-and-mysql /)。 –
我相信你的意思是说,每当我需要结果时,用下一个计数器打数据库? – user3104225
我的意思是,如果有一种方法来打击查询,然后得到结果(主键)的指针。并使用这些指针获得下一组结果(实际数据)。 – user3104225