java - 提高 Primefaces 数据表性能

标签 java sql jsf jpa primefaces

我想知道是否有办法提高数据表的性能。

这是我的场景:

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

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

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

这是我的惰性数据模型:

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;
  }

  ...                
}

一切似乎都工作正常,但仍然有一个问题:

虽然数据在几毫秒内加载,但我仍然必须执行另一个查询来设置行数,并且这个查询仍然需要几秒钟才能返回结果,我已经尝试不设置它,但是数据表没有显示任何数据。

我测量了设置行数所需的时间,结果是 5438 毫秒,我认为不值得花这么多时间来设置这个值。有人对如何改进这个有任何建议吗?

我正在使用 Primefaces 3.4.1、JSF 和 JPA2。

最佳答案

尝试仅计算主键:

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

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

祝你好运!

关于java - 提高 Primefaces 数据表性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058774/

相关文章:

java - 按位运算来比较值

java - 向用户显示随机对象时使用访问器方法?

sql - 生成日期范围之间的日期

java - 更新用户界面 :repeat partially JSF Primefaces

java - 在 Selenium Java 中选择多个下拉列表

java - 编译 : wrong version 50. 0 时出现异常,应为 49.0

sql - 像整数运算符

mysql - 如何在 MySQL 中使用 tag_ids 获取相关问题?

jsf - 如何在 Facelets 的 EL bool 表达式中使用 && ?

jsf - 如何使用 f :metadata JSF tag?