2009-09-04 3 views
1

richfaces와 toplink를 사용하는 간단한 CRUD 프로젝트가 있습니다. 일부 페이지가로드되는 속도가 느리므로 톱 링크의 로깅 수준을 FINE으로 바꿨습니다. rich : datatable의 모든 코스 객체를 나열하는 내 페이지를로드 할 때 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로 불리는 얻을 내 콩의 기능 :

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가 라이프 사이클 요청 당 한 번만 호출되도록 보장하지 않습니다. getter에 값 비싼 코드를 넣지 마십시오 (예 : getter). 쿼리를 수행하고 getCourses를 호출 할 때마다 datamodel을 작성하면 JSF 스펙은 요청 당 프레임 워크가 원하는만큼이 메소드를 호출 할 수있다.

+0

시도하고있는 것처럼 모든 항목을 표시하는 모범 사례가 있습니까? 내 객체를 데이터베이스에 저장하는 것뿐만 아니라 메모리에 보관해야합니까? 동시에 여러 사용자가이 항목을 편집하게하므로 모든 항목을 동기화 상태로 유지해야합니다. – KevMo

+0

나는 Seam을 사용하기 시작할 때까지 db에 도달하는 명시 적 '새로 고침'버튼을 추가 했었는데, 이제는 seam 이벤트 모델과 outjection을 사용합니다. – shipmaster