2012-05-29 71 views
0

我遇到了頁面加載數據的問題。 rich:datatable用於顯示公告列表。HIbernate與收藏緩慢加載數據

公告類包括設置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萬的公告數據庫和3,5百萬手。一個公告可以有1個甚至100個批次。

頁面只加載30個公告查詢的第一個結果。它在數據庫中沒有批次時快速加載,但有很多時間可能需要大約1.5分鐘。

我試圖改變懶惰爲真和谷歌這個問題,但沒有找到太多。有人能幫忙嗎?

更新:

檢查哪些查詢需要大量的時間後,我發現該行計數查詢的原因。由於缺省過濾器參數,查詢包含lots.sum條件。我已經更換過濾器,因此不必使用該設置,性能得到了改善。

謝謝大家的幫助。

+0

您是否嘗試過使用數據庫跟蹤來查看實際運行的查詢? –

+0

是的,只是發現通知總數的計數查詢需要很長時間,並且會將數據複製到tmp表中。而這個由hibernate生成的查詢包含左連接到多個表。 –

+0

行計數實現爲'criteria.setProjection(Projections.rowCount());'不知道它可能有什麼問題。 –

回答

2
+0

謝謝你的回答。我已經嘗試過,但仍然很慢。我沒有注意到<多對一名稱=「tender」class =「Tender」column =「tenderId」 />在公告類映射中。似乎它會導致問題。檢查mysql服務器狀態,看起來是發送數據查詢「選擇計數(*)作爲y0_從isdb.announcement this_左外部連接isdb.tender_announcements this_1 on this_」需要整整2分鐘。 –