我想知道是否有办法提高数据表的性能。
这是我的场景:
我的应用程序有很多数据表,显示来自数据库中一些非常大的表的数据(我说的是具有数百万行的表),并且它们与其他表也有很多关系,所以我需要非常小心从它们加载数据,否则我的应用程序会变得非常慢。
我的第一步是实现一个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/