我想知道是否有办法增强dataTable的性能。
以下是我的情景:
我的应用程序有很多dataTables显示来自数据库中一些非常大的表的数据(我说的是有数百万行的表),而且它们与其他表有很多关系,所以我需要非常小心从他们加载数据,否则我的应用程序将变得非常慢。
我的第一步是实现一个lazyDataModel,因此dataTable只能加载当前页面中显示的数据,当然不能选择不执行此操作,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 :(得分:0)
尝试计算只是主键:
setRowCount(loadData("SELECT COUNT(t."+entityPkFieldName()+") FROM "+ entity()+ " t WHERE "+ whereClause));
当然,您需要Pk字段名称。
祝你好运!