1

我正在使用 Primefaces Datatable 组件,系统后端正在运行 Glassfish 和 Oracle 数据库。

执行大型搜索操作时,AppServer 上的负载变得过多。Appserver 总是加载完整的结果集,这是太多的负载。 我正在寻找通过从数据库中选择“页面”来优化 Appserver 负载的方法?

在 Primefaces 数据表中使用分页会导致只有一个页面被传输到客户端。这很好,但 Appserver 仍会加载完整的结果集。

我在想我也许可以:

  1. 首先对数据库进行计数(*),以查看总结果集的大小。
  2. 然后只对我的 Appserver SessionBean 的唯一标识符列表(代表完整选择)进行选择
  3. 然后选择一页“full resultset-data”返回给客户端。

然后客户端可以按下“下一页”按钮让 AppServer 从数据库中获取第二页。此获取必须使用“唯一标识符”列表(或者我可以使用“rownum”变量来指定完整选择的子集)。IE。在实践中,我最终会“手动”进行分页</p>

当用户按下分页器按钮时,我如何使用 Primefaces Datatable 组件并在我的 Appserver 代码中获得控制权?

当然欢迎任何替代的处理方式。

4

1 回答 1

1

PrimeFaces 数据表开箱即用地支持这一点。只需将您的模型包装在 PrimeFaces 提供的类中,并在其方法LazyDataModel中实现所需的子选择作业。load()

启动示例(完整示例请参见展示):

<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()返回从给定索引开始的所需项目,具有给定大小,并且如果需要已经对给定参数进行了排序/过滤。

于 2013-08-29T13:09:03.933 回答