【问题标题】:HIbernate slow data loading with collections使用集合加载 HIbernate 缓慢的数据
【发布时间】:2012-06-03 14:30:56
【问题描述】:

我在页面加载数据时遇到问题。 rich:datatable 用于显示公告列表。

Announcement 类包括一组 AnnouncedLot 类,并在映射中指定为

<set cascade="all,delete-orphan" lazy="false" name="lots" table="ad_lot">
<key column="lotId"/>
<many-to-many class="AnnouncedLot" column="anlotId"/>
</set>

AnnouncedLot 类映射是

<class name="AnnouncedLot" table="announcedLot">
  <id name="id" type="java.lang.Long" unsaved-value="-1">
     <generator class="native"/>
  </id>
  <property name="idValue" not-null="false" unique="true"/>
  <property name="databaseId" not-null="false" unique="true"/>
  <property length="4047" name="title"/>
  <property length="4047" name="description"/>
  <property length="4047" name="source"/>
  <property length="65534" name="adText"/>
  <property name="sum"/>
</class>

目前,数据库中大约有 150 万条公告和 350 万手。一份公告可以有 1 手甚至 100 手。

页面仅加载公告查询的 30 个第一个结果。当数据库中没有批次时,它会快速加载,但有批次时可能需要大约 1.5 分钟。

我尝试将lazy 更改为true 并用Google 搜索这个问题,但没有找到太多。有人可以帮忙吗?

更新:

在检查了哪些查询花费了很多时间后,我发现行计数查询是原因。由于默认过滤器参数,查询包含lots.sum 条件。我已经更改了过滤器,因此它不必使用该组并且性能有所提高。

感谢大家的帮助。

【问题讨论】:

  • 您是否尝试过数据库跟踪以查看实际运行的查询?
  • 是啊,刚发现总公告数的count查询耗时长,在复制数据到tmp表时挂了。而这个由 hibernate 生成的查询包含对很多表的左连接。
  • 行数实现为criteria.setProjection(Projections.rowCount()); 不知道有什么问题。

标签: java hibernate spring-webflow


【解决方案1】:

【讨论】:

  • 感谢您的回答。我已经尝试过了,但它仍然很慢。我没关注 在公告类映射中。似乎它会导致问题。检查 mysql 服务器状态,似乎为查询“select count(*) as y0_ from isdb.announcement this_ left outer join isdb.tender_announcements this_1 on this_”发送数据需要整整 2 分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多