【问题标题】:Hibernate displaytag big listsHibernate displaytag 大列表
【发布时间】:2009-12-17 10:43:48
【问题描述】:

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

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

【问题讨论】:

  • 不正常。提供有关您的配置、设置、网络环境等的更多详细信息。
  • 我正在查询一个包含大量数据的 DB2 数据库。配置是为我的 DAO 使用 Spring 2.5.6 的 JSR-168 Portlet。查询非常复杂,包含一些异常,并且 IN(Selects..) Server 和 Db 在同一台机器上
  • 查询在 SQL 客户端中的执行情况如何?
  • 我不确定它应该需要 > 5 分钟,但 displaytag 不喜欢大型数据集。
  • 在我的 SQL 客户端中查询需要一段时间,但不到 20 秒。

标签: java hibernate jsp displaytag


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    编辑:您评论说您正在使用 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 内存中查询整个表更有效。还要确保该表已正确编入索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多