1

我正在使用 displaytag 用我的数据库中的数据构建表。如果请求的列表不是那么大,但如果列表大小超过 2500 个条目,则获取结果列表需要很长时间(超过 5 分钟)。我想知道这种行为是否正常。

您如何处理返回大结果的大列表/查询?

4

2 回答 2

1

本文链接到如何解决问题的示例应用程序。Displaytag 期望传递一个完整的数据集来创建分页链接和处理排序。这种方式打破了在外部对数据进行分页并仅获取那些被请求的行的想法(当用户向它们分页时)。文章中链接的项目描述了如何设置这种类型的东西。

如果您使用的是大型数据库,则执行查询时也可能会遇到问题。我想你已经排除了这一点。如果没有,您有前面提到的 SQL ——我将通过 DB2 查询分析器运行它以查看是否存在任何数据库瓶颈。链的下一步是在没有显示标签的单元测试中运行 Hibernate/DAO 调用的测试。同样,从你的措辞来看,听起来你已经这样做了。

于 2009-12-17T17:53:57.370 回答
0

Displaytag 将所有内容传输并存储在内存(会话)中。Hibernate 也这样做。您不希望一次将整个 DB 表的内容保存在内存中(但是,如果减速已经从 2500 行开始,它更像是 SQL 查询/数据库表优化不佳的问题;2500 行应该是花生体面的数据库,但好吧,那是另一回事)。

而是自己创建一个 HTML 表格,几乎不需要 JSTL c:forEachEL的帮助。在后台保留一个或两个请求参数input type="hidden":要显示的第一行(firstrow)以及最终一次显示的行数(rowcount)。

然后,在您的 DAO 类SELECT stuff FROM data LIMIT firstrow OFFSET rowcount中,根据使用的数据库执行一个或类似的操作。在 MySQL 和 PostgreSQL 中,您可以使用类似的LIMITand/orOFFSET子句。在 Oracle 中,您需要触发子查询。在 MSSQL 和 DB2 中,您需要创建一个 SP。您可以使用 HQL 做到这一点。

然后,要翻阅表格,只需有一堆按钮,指示服务器端代码每次都增加/firstrow减少rowcount。只是做数学。

编辑:您评论说您正在使用 DB2。我做了一些研究,看来您可以ROW_NUMBER()为此使用 UDB OLAP 函数:

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;

此示例应返回表中的前 10 行data。您可以参数化此查询,以便您可以为每个页面重复使用它。这比查询 Java 内存中的整个表更有效。还要确保该表已正确索引。

于 2009-12-17T11:22:53.800 回答