2014-09-26 103 views
3

我想知道是否有一種方法,以提高DataTable的性能。提高Primefaces DataTable的性能

這裏是我的情況:

我的應用程序有很多,從一些非常巨大的表從數據庫(我說的是表有幾百萬行)顯示數據的數據表中,他們也有很多有關係的其他表格,所以我需要非常小心地加載他們的數據,否則我的應用程序會變得非常慢。

我的第一步是實現一個lazyDataModel,所以dataTable只能加載當前頁面顯示的數據,當然這不是一個不這樣做的選項,dataTable甚至不會加載如果我試圖提供所有數據,但即使使用延遲加載,也需要幾秒鐘的時間才能加載。

爲了減少加載時間多一點,我只有把正在使用的數據表中的列,所以不是寫這樣的查詢:

SELECT t FROM Table t 

我寫這一個:

SELECT t.column1, t.column2, t.column3, t.column4 FROM Table t 
//The four columns are only ones that are being displayed on the dataTable. 

通過這樣做,性能顯着提高,現在數據加載速度不夠快,加載只需要幾毫秒。

這裏是我的lazyDataModel:

public class MyLazyDataModel<T> extends LazyDataModel<T> implements Serializable { 

    @Override 
    public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) { 
     DataTable dt = (DataTable) UIViewRoot.getCurrentComponent(FacesContext.getCurrentInstance()); 
     String whereClause = getfilters(filters); 

     //Load the data 
     List data = loadData("SELECT "+columns(dt)+" FROM "+ entity()+ " t WHERE "+ whereClause, first, pageSize); 

     //Set the row count 
     setRowCount(loadData("SELECT COUNT(t) FROM "+ entity()+ " t WHERE "+ whereClause)); 

     return data; 
    } 

    ...     
} 

似乎一切都做工精細,但仍有一個問題:

雖然數據被在幾毫秒內加載,我還是要執行另一個查詢來設置行數,而這個仍然需要幾秒鐘來返回結果,我試過不設置它,但dataTable沒有顯示任何數據。

我測量設置的行數所花費的時間,結果爲5438毫秒,我不認爲這是值得花費這麼多的時間只是設置這個值。有沒有人有任何關於如何改善這個問題的建議?

我使用Primefaces 3.4.1,JSF和JPA2。

+0

分析您的查詢將是我的第一個建議,請確保您正在搜索的列有適當的索引。不要在where子句中使用太多的函數。 – 2014-09-26 11:53:17

+0

調整樣本,以限制返回值的區別。在這個例子中,「Select count」結果等於'data.size()'。 – jmvivo 2014-09-26 11:59:46

+1

問題超出了您的Web應用程序。你的查詢需要分析;這裏可能需要一些非規範化。問題的關鍵是,有沒有靈丹妙藥,你會堅持在表示層,那將讓你的數據層的問題就消失了 – kolossus 2014-09-26 13:59:37

回答

0

試算只是主鍵:

setRowCount(loadData("SELECT COUNT(t."+entityPkFieldName()+") FROM "+ entity()+ " t WHERE "+ whereClause)); 

當然,你需要PK場名稱。

祝你好運!

+0

它並沒有太大的差別。 – 2014-09-26 12:18:28