2014-02-21 46 views
0

您好我有一個primefaces數據表有大約52000記錄被提取。因爲它是一個大型的數據集,我嘗試使用滾動行數等於20的primefaces的實時滾動功能。的列是53.該表還在每列上都有篩選和排序功能。即使我對錶的性能不滿意,頁面加載大約需要15秒,最糟糕的是它需要大約65秒用於在滾動結束時加載下一組20條記錄。Primefaces實時滾動花費很長時間與大型數據集

僅用於測試,我將記錄總數減少到25000,並且性能提高了29秒的滾動時間。 我真的無法理解,爲什麼每次只顯示20條記錄需要很長時間。記錄總數不應該影響性能。

有人可以請建議如何提高performance.I無法爲這個實現分頁,因爲我的客戶不希望it.Thanks提前

我的JSF代碼片段

<p:dataTable id="arcRecList" var="data" 
      value="#{archivedRecordBean.archiveItems}" 
      tableStyle="table-layout:auto; width:80%;" styleClass="datatable" 
      scrollable="true" scrollWidth="84%" scrollHeight="69%" 
      columnClasses="columnwidth" liveScroll="true" scrollRows="20" 
      filteredValue="#{archivedRecordBean.filteredArchiveItems}"> 


      <p:column style="width:250px" headerText="Insured" 
       filterBy="#{data.insuredName}" sortBy="#{data.insuredName}"> 
       <h:outputText value="#{data.insuredName}" /> 
      </p:column> 

      <p:column style="width:250px" headerText="City" 
       filterBy="#{data.custAddress_City}" 
       sortBy="#{data.custAddress_City}"> 
       <h:outputText value="#{data.custAddress_City}" /> 
      </p:column> 
       . 
       . 
       .53 columns 
       . 
     </p:dataTable> 

我的管理豆

@ManagedBean

@RequestScoped

公共類ArchivedRecordBean實現Serializable {

private List<WorkSpaceItem> archiveItems=null; 
private List<WorkSpaceItem>filteredArchiveItems; 
private WorkSpaceItem objWorkSpaceItem=null; 
JdbcConnection jdbcConnection=null; 
Connection connection=null; 
Statement selectStmt=null; 
ResultSet rs=null; 
public ArchivedRecordBean() 

{ 
    getArchiveFields(); 

} 
public List<WorkSpaceItem> getArchiveItems() { 
    return archiveItems; 
} 
public void setArchiveItems(List<WorkSpaceItem> archiveItems) { 
    this.archiveItems = archiveItems; 
} 
public WorkSpaceItem getObjWorkSpaceItem() { 
    return objWorkSpaceItem; 
} 
public void setObjWorkSpaceItem(WorkSpaceItem objWorkSpaceItem) { 
    this.objWorkSpaceItem = objWorkSpaceItem; 
} 

public List<WorkSpaceItem> getFilteredArchiveItems() { 
    return filteredArchiveItems; 
} 
public void setFilteredArchiveItems(List<WorkSpaceItem> filteredArchiveItems) { 
    this.filteredArchiveItems = filteredArchiveItems; 
} 
public void getArchiveFields() 
{ 
    try 
    { 
     jdbcConnection=new JdbcConnection(); 
     connection=jdbcConnection.getJdbcConnection(); 
     selectStmt=connection.createStatement(); 
     String query="select * from LPINFO where LPINFO.ClearDate < (select TOP 1 Tbl_CurrentYear.CurrentYear from dbo.Tbl_CurrentYear)" 
       +"AND (LPINFO.ClearDate is not null)"; 
     rs=selectStmt.executeQuery(query); 
     archiveItems=new ArrayList<WorkSpaceItem>(); 
     while(rs.next()) 
     { 

      objWorkSpaceItem=new WorkSpaceItem(); 
      objWorkSpaceItem.setInsuredName(rs.getString("InsuredName")); 
      objWorkSpaceItem.setCustAddress_City(rs.getString("CustAddress_City")); 
      objWorkSpaceItem.setCustAddress_State(rs.getString("CustAddress_State")); 
      . 
      . 
      .//Setting the values for remaining columns 
      . 
      . 
      archiveItems.add(objWorkSpaceItem); 

     } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     try { 

      connection.close(); 
     } catch (SQLException e) { 

      e.printStackTrace(); 
     } 

    } 

} 

}

回答

0

嘗試改變管理bean來@ViewScoped。我現在不能進行測試,但據我所知,每個HTTP請求上都會創建一個requestScoped bean,所以我認爲問題可能是您正在查詢每個滾動條上的數據庫。這將解釋爲什麼加載時間隨着桌面上較少的記錄而減少。

0

我花了這麼久,因爲你是在每個請求(每個請求都重新創建@RequestScope bean)時,從數據庫加載所有項目。

如果您更改爲@ViewScope,您將只加載一次數據,但它們全部存儲在會話中,會降低服務器速度。如果你在客戶端保存狀態,它會對網絡使用產生巨大的影響,並且由於序列化/反序列化,CPU使用率非常高。不是一個好主意。

您應該至少執行LazyDataModel,並且始終限制從數據庫中讀取的數據量(對於最終用戶,從UX視圖中提供超過1000頁是沒有意義的)。

+0

感謝Lukasz的回覆。真正值得使用LazyDataModel進行實時滾動。據我所知,根據primefaces論壇中的響應之一進行實況滾動是無用的(http: //forum.primefaces.org/viewtopic.php?f=3&t=20772) – rks