我想知道是否有一種方法,以提高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。
分析您的查詢將是我的第一個建議,請確保您正在搜索的列有適當的索引。不要在where子句中使用太多的函數。 – 2014-09-26 11:53:17
調整樣本,以限制返回值的區別。在這個例子中,「Select count」結果等於'data.size()'。 – jmvivo 2014-09-26 11:59:46
問題超出了您的Web應用程序。你的查詢需要分析;這裏可能需要一些非規範化。問題的關鍵是,有沒有靈丹妙藥,你會堅持在表示層,那將讓你的數據層的問題就消失了 – kolossus 2014-09-26 13:59:37