2013-08-29 80 views
1

我正在使用Primefaces Datatable組件,系統後端正在運行Glassfish和Oracle數據庫。如何將客戶端到數據庫的sql-requests頁面

當執行大型搜索操作時,AppServer上的負載變得太大。 Appserver始終加載完整的結果集,這是太多的負載。 我正在尋找通過從數據庫中選擇「頁面」來優化Appserver上的負載的方法嗎?

在Primefaces Datatable中使用分頁僅導致將頁面傳輸到客戶端。這很好,但Appserver仍然加載完整的結果集。

我在想,我也許可以:

  1. 首先做一個COUNT(*)對DB,看到總 結果集的大小。
  2. 然後在我的應用程序服務器SessionBean上僅選擇一個唯一標識符列表(代表完整選擇)
  3. 然後選擇一個「full resultset-data」頁面並將其返回給客戶端。

客戶端然後可以按下「下一頁」按鈕讓AppServer從數據庫中獲取第二頁。 這個提取將不得不使用'唯一標識符'-list(或者我可以使用'rownum'變量來指定完整選擇的子集)。 也就是說。在實踐中,我最終做「手動」分頁

我怎麼能使用Primefaces Datatable組件,並獲得控制在我的Appserver代碼時,用戶按下paginator按鈕?

處理此問題的任何替代方法當然是受歡迎的。

回答

1

PrimeFaces數據表支持此功能。只需將您的模型包裝在PrimeFaces提供的LazyDataModel類中,然後在其load()方法中實施所需的子選擇作業。

開球示例(參見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()返回恰好所需的項目開始於給定的索引,將具有給定的尺寸,並且如果必要的已經按給定的參數排序/過濾。

+0

謝謝你的迴應。正如我理解PF中的Lazyload機制,完整的數據源被加載到數據模型(即進入內存)中。然後它會對該集進行過濾,排序和分頁。當數據源由數百萬個對象組成時(真正的巨大),這會表現不佳,並且有100多個併發用戶。我發現至少甲骨文已經沒有了。稱爲分析功能(其他供應商具有類似的機制),其中分頁在數據庫內完成,沒有性能損失。要使用這個,我需要在數據表控件中的按鈕。 –

+0

@Erik:咦? 「first」和「pageSize」的哪一部分不理解?這不應該返回完整的數據庫副本。這將徹底擊敗「延遲加載」的含義,並使整個機制無用。如果您啓用了排序/篩選功能,那麼只需將該信息傳遞給該服務,以便它可以準確返回所需的數據。 – BalusC

+0

我在PF Showcase頁面查看了這個例子。在我看來,完整的datamodel被緩存在數據模型中。< –

相關問題