【发布时间】: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