如何将sql-requests从客户端分页到数据库

时间:2013-08-29 11:38:43

标签: sql jsf primefaces glassfish

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

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

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

我在想我也许可以:

  1. 首先对db进行计数(*),以查看总数的大小 结果集。
  2. 然后在我的Appserver SessionBean中仅选择一个唯一标识符列表(表示完整选择)
  3. 然后选择“完整结果集 - 数据”页面并将其返回给客户端。
  4. 然后,客户端可以按下“下一页”按钮,让AppServer从数据库中获取第二页。 这个提取必须使用'唯一标识符'-list(或者我可以使用'rownum'变量来指定完整选择的子集)。  IE浏览器。在实践中,我最终“手动”进行分页

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

    任何其他处理方法当然都是受欢迎的。

1 个答案:

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