我使用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的内存查询整个表更高效。还确保表被适当地编制索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top