Hibernate的displaytag大名单
-
20-09-2019 - |
题
我使用displaytag建立从我的数据库中的数据表。这种运作良好,如果请求的列表并不大,但如果列表大小增长超过2500项,获取结果列表需要很长(超过5分钟或更长)。我想知道,这是正常现象。
您如何处理大名单/查询其返回结果大?
解决方案
本文链接的如何去解决这个问题的一个示例应用程序。 Displaytag希望传递一个完整的数据集,以创建分页链接和处理排序。这种断裂的分页外部上的数据,仅获取被要求(如用户的网页对他们)那些行的想法。在文章中的链接项目介绍如何去设置这种类型的事情了。
如果您正在使用大型数据库的工作,你也有执行查询的一个问题。我假设你已经排除了这一可能性。如果没有,则必须根据前面提到的SQL - 我会运行它通过DB2查询分析器,看看是否有任何DB瓶颈。下一步链向上是无需在混合displaytag运行在单元测试休眠/ DAO呼叫的测试。再次,从如何你措辞的东西,这听起来像你已经做到了这一点。
其他提示
由标签拖拉并存储一切都在存储器(会话)。 Hibernate也做到这一点。你不想拥有整个数据库表内容在内存中(但是,如果经济放缓已开始在2500行,它看上去更像优化不好的SQL查询的问题一下子/ DB表; 2500行应该是一个花生体面的DB,但OK,那是另一回事)。
而自己创建一个HTML表的 JSTL帮助不大 c:forEach
和 EL 。保持一个或两个请求参数在input type="hidden"
背景:将被显示在第一行(firstrow
),并最终在一次要显示的行的数量(rowcount
)
然后,在你的DAO类只是做一个SELECT stuff FROM data LIMIT firstrow OFFSET rowcount
或类似的是,根据DB用过的东西。在MySQL和PostgreSQL可以使用LIMIT
和/或OFFSET
条款类似。在Oracle中你需要射击一个子查询。在MSSQL和DB2你需要创建一个SP。你可以做到这一点与HQL。
然后,通过表页,只是具有指示服务器端代码以在/递减与firstrow
每次所述rowcount
一系列按钮。只是做数学题。
修改:您的评论您正在使用DB2。我已经做了一些研究,看来,您可以使用UDB OLAP功能ROW_NUMBER()
此:
SELECT id, colA, colB, colC
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY id) AS row, id, colA, colB, colC
FROM
data
) AS temp_data
WHERE
row BETWEEN 1 AND 10;
这个例子应该从data
表中返回前10行。您可以参数化此查询,这样就可以重新使用它的每一页。这比Java的内存查询整个表更高效。还确保表被适当地编制索引。