【问题标题】:Improving Primefaces DataTable Performance提高 Primefaces 数据表的性能
【发布时间】:2014-11-21 10:02:35
【问题描述】:

我想知道是否有办法提高 dataTable 的性能。

这是我的场景:

我的应用程序有很多 dataTables 显示来自数据库中一些非常大的表的数据(我说的是具有数百万行的表),并且它们与其他表也有很多关系,所以我需要非常小心从它们加载数据,否则我的应用程序会变得很慢。

我的第一步是实现一个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. 

这样做显着提高了性能,现在数据加载速度足够快,只需几毫秒即可加载。

这是我的惰性数据模型:

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 子句中使用太多函数。
  • 调整样本,以区别您限制返回值的位置。在示例中,Select count 结果等于data.size()
  • 问题超出了您的 Web 应用程序。您的查询需要分析;这里可能需要进行一些非规范化。关键是,没有什么灵丹妙药可以让你的数据层问题消失
  • @kolossus 我同意你的观点,最好在数据层解决这个问题,我会继续寻找解决方案,感谢您的回答!
  • 我认为原生 SQL 查询会有所帮助

标签: java sql jsf jpa primefaces


【解决方案1】:

尝试计算主键:

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

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

祝你好运!

【讨论】:

  • 没什么区别。
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多