我正在使用Primefaces Datatable组件,系统后端正在运行Glassfish和Oracle数据库。
进行大型搜索操作时,AppServer上的负载变得过大。 Appserver总是加载完整的结果集,这是太多的负载。 我正在寻找通过从数据库中选择“页面”来优化Appserver负载的方法吗?
在Primefaces数据表中使用分页只会导致页面传输到客户端。这很好,但Appserver仍然加载完整的结果集。
我在想我也许可以:
然后,客户端可以按下“下一页”按钮,让AppServer从数据库中获取第二页。 这个提取必须使用'唯一标识符'-list(或者我可以使用'rownum'变量来指定完整选择的子集)。 IE浏览器。在实践中,我最终“手动”进行分页
当用户按下分页器按钮时,如何使用Primefaces Datatable组件并在我的Appserver代码中获得控制权?
任何其他处理方法当然都是受欢迎的。
答案 0 :(得分:1)
PrimeFaces数据表支持此功能。只需将您的模型包装在PrimeFaces提供的LazyDataModel
类中,并在其load()
方法中实现所需的子选择作业。
Kickoff示例(有关完整示例,请参阅showcase):
<p:dataTable lazy="true" value="#{bean.model}" ...>
与
private DataModel<Item> model; // +getter
@EJB
private ItemService service;
@PostConstruct
public void init() {
model = new LazyDataModel<Item>() {
@Override
public List<Item> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
// We ignore sortfield/sortorder/filters in this simple example. This job is up to you.
this.setRowCount(service.count());
return service.list(first, pageSize);
}
};
}
// ...
其中service.list()
返回完全从给定索引开始的所需项目,具有给定大小,并且如果必要,已经对给定参数进行了排序/过滤。