2009-12-17 72 views
1

我使用displaytag從我的數據庫建立數據表。如果請求的列表不是那麼大,但是如果列表大小增加超過2500個條目,則這很有效,提取結果列表需要很長時間(超過5分鐘)。我想知道這種行爲是否正常。休眠displaytag大列表

如何處理返回大結果的大列表/查詢?

+0

這是不正常的。給出您的配置,設置,網絡上下文等的更多細節。 – Bozho 2009-12-17 10:47:19

+0

我正在查詢大量數據的DB2數據庫。配置是對我的DAO使用Spring 2.5.6的JSR-168 Portlet。該查詢非常複雜,並且包含一些except和IN(選擇..) 服務器和Db位於同一臺計算機 – onigunn 2009-12-17 13:19:11

+0

查詢如何在SQL客戶端中執行? – 2009-12-17 16:43:34

回答

1

This article鏈接到如何解決問題的示例應用程序。 Displaytag希望傳遞一個完整的數據集來創建分頁鏈接並處理排序。這種打破了對數據進行外部分頁的想法,並且僅僅獲取那些被詢問的行(作爲用戶頁面給他們)。本文鏈接的項目描述瞭如何設置這種類型的東西。

如果您使用的是大型數據庫,那麼執行查詢時可能也會出現問題。我想你已經排除了這一點。如果沒有,那麼你有前面提到的SQL - 我會通過DB2查詢分析器來運行它,看看是否有任何數據庫瓶頸。鏈上的下一步是在單元測試中運行Hibernate/DAO調用的測試,而在混合中沒有顯示標籤。再次,從你如何表達事情,聽起來你已經做到了。

0

Displaytag牽引並將所有內容存儲在內存中(會話)。休眠也可以。您不希望在內存中同時擁有整個數據庫表內容(但是,如果減速已經開始於2500行,則它看起來更像是SQL查詢/數據庫表格非常優化的問題; 2500行應該是花生體面的數據庫,但好的,這是另一回事)。

寧可自己創建一個HTML表格,只需幾乎沒有JSTLc:forEachEL的幫助。在input type="hidden"的背景中保留一個或兩個請求參數:要顯示的第一行(firstrow)以及最終要一次顯示的行數(rowcount)。

然後,在您的DAO類中,只需執行SELECT stuff FROM data LIMIT firstrow OFFSET rowcount或類似的操作,具體取決於所使用的數據庫。在MySQL和PostgreSQL中,您可以使用這樣的LIMIT和/或OFFSET子句。在Oracle中,您需要激發子查詢。在MSSQL和DB2中,您需要創建一個SP。你可以用HQL來做到這一點。

然後,要瀏覽表格,只需要有一堆按鈕,它們會指示服務器端代碼每次都在中加入/減少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內存中查詢整個表更有效。還要確保表格已正確編制索引。