如果结果集很大,那么将整个结果集放在内存中(服务器缓存,例如淡褐色)将不可行。使用大型结果集时,您无法将它们放在内存中。在这种情况下,您必须一次获取一块数据(基于查询的分页)。使用基于查询的分页的缺点是,对于多个页面请求,将有多次调用数据库。
任何人都可以建议如何实现它的混合方法。 我还没有把任何示例代码放在这里,因为我认为问题更多的是关于逻辑而不是特定代码。如果你需要示例代码,我可以把它放进去。
提前致谢。
答案 0 :(得分:1)
最有效的解决方案是使用主键作为分页标准。这使我们能够依赖第一类构造,如区间查询,这对于RDBMS来说很容易优化,查询实体的主键最多可能已被编入索引。
使用主键上的范围查询检索数据分为两步。首先必须检索主键集合,然后生成间隔以正确识别数据的正确子集,然后对数据进行实际查询。
这种方法几乎与蛮力版本一样快。内存消耗约为十分之一。通过为此实现选择适当的页面大小,您可以更改执行时间和内存消耗之间的比率。此版本也是无状态的,它不会像ScrollableResults
版本那样保留对资源的引用,也不会像使用setFirstResult/setMaxResult
的版本一样使数据库紧张。