2009-09-04 2 views
1

私はrichfacesとtoplinkを使っている単純なCRUDプロジェクトを持っています。私はいくつかのページの読み込みがかなり遅いことに気づいたので、私はtoplinkのログレベルをFINEに変えました。リッチ:データテーブル内のすべてのコースオブジェクトをリストするマイページをロードするとき、toplinkは同じselect all queryを9回実行しているようです。 rich:datascrollerを使用して次の50項目の項目に移動したり、列を並べ替えたりすると、同じselect all queriesが18回以上実行されます。ここで不自然にデータベースにぶつかるRichfaces

は、データテーブルである:

<rich:dataTable value="#{CourseController.courses}" 
         id="table" 
         var="dataTableItem" 
         rendered="#{CourseController.courses.rowCount>0}" 
         rows="50" 
         onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" 
         onRowMouseOver="this.style.backgroundColor='#dcdcdc'"> 
      <f:facet name="header"> 
       <h:outputText value="Courses"/> 
      </f:facet> 
      <rich:column sortBy="#{dataTableItem.id}"> 
       <f:facet name="header"> 
        <h:outputText value="ID"/> 
       </f:facet> 
       <h:commandLink action="#{CourseController.viewCourse}"> 
        <h:outputText value="#{dataTableItem.id}" /> 
        <f:param name="id" value="#{dataTableItem.id}" /> 
       </h:commandLink> 
      </rich:column> 
      <rich:column sortBy="#{dataTableItem.name}"> 
       <f:facet name="header"> 
        <h:outputText value="Name"/> 
       </f:facet> 
       <h:outputText value="#{dataTableItem.name}" /> 
      </rich:column>   
      <rich:column sortBy="#{dataTableItem.owner}"> 
       <f:facet name="header"> 
        <h:outputText value="Owner"/> 
       </f:facet> 
       <h:outputText value="#{dataTableItem.owner}" /> 
      </rich:column> 
      <rich:column rendered="#{LoginController.inSystemAdminGroup || LoginController.inOperationsManagerGroup || LoginController.inLogisticsCoordinatorGroup}"> 
       <f:facet name="header"> 
        <h:outputText value=""/> 
       </f:facet> 
       <h:commandLink action="#{CourseController.editCourse}"> 
        <h:outputText value="Edit/Delete"/> 
        <f:param name="id" value="#{dataTableItem.id}" /> 
       </h:commandLink> 
      </rich:column> 
      <f:facet name="footer"> 
       <rich:datascroller id="datascroller" /> 
      </f:facet> 
     </rich:dataTable> 

テーブルで呼ばれています私のコントローラでの機能:

public DataModel getCourses() { 
     System.out.println("Im in getCourses. Fun Fun Fun."); 
     model = new ListDataModel(courseFacade.findAll()); 
     return model; 
    } 

getCourses()関数によって呼び出されるのget私のBean内の機能:

public List<Course> findAll() { 
     System.out.println("Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!!"); 
     Query q = em.createQuery("select object(o) from Course as o WHERE o.deleted = FALSE ORDER BY o.name"); 
     List<Course> courses = q.getResultList(); 
     return courses; 
    } 

テーブルをページにロードするとき、コンソール出力:

Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 
Im in getCourses. Fun Fun Fun. 
Selectin all the courses in the freaking database!!!!!!!!!!!!!!!!!!!!!! 
SELECT ID, MODIFIEDBY, ACRONYM, EMSID, DELETED, REMINDEREMAILTEXT, DATEADDED, NUMDAYSREMINDER, DATEDELETED, ADHOC, DATEMODIFIED, ADDEDBY, OWNER, DELETEDBY, OPTLOCK, NAME FROM COURSE WHERE (DELETED = ?) ORDER BY NAME ASC 
     bind => [false] 

答えて

2

JSF仕様では、ライフサイクルリクエストごとにgetterが1回しか呼び出されないことは保証されていません。getterに高価なコードを入れないでください。あなたはクエリを実行してgetCoursesの各呼び出しでdatamodelを作成していますが、JSF仕様ではこのメソッドを、フレームワークが要求ごとに必要なだけ多く呼び出すことができます)。

+0

私がしようとしているように、すべてのアイテムを表示するためのベストプラクティスはありますか?オブジェクトをデータベースに保存するだけでなく、データベースに保存する必要がありますか?同時に複数のユーザーにこれらのアイテムを編集させるので、すべてを同期させる方法が必要です。 – KevMo

+0

私はSeamの使用を開始するまで明示的に 'refresh'ボタンを追加していましたが、今はseamイベントモデルとoutjectionを使用しています。 – shipmaster

関連する問題