改善Primefaces DataTable性能

时间:2014-09-26 11:44:52

标签: java sql jsf jpa primefaces

我想知道是否有办法增强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。

1 个答案:

答案 0 :(得分:0)

尝试计算只是主键:

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

当然,您需要Pk字段名称。

祝你好运!