2013-07-10 26 views
2

我有兩段代碼基本上做同樣的事情。我用兩種不同的方式填充數據表。下面是它們:哪個更好? - 每次查詢數據庫或保留會話中的對象

<h:dataTable binding="#{currentUser.ITEMS}" style=" width:505px;" id="userTable" value="#{currentUser.items}" var="user" > 
    <h:column> 

    </h:column> 
    <h:column> 
     <f:facet name="header">Account Number</f:facet> 
      #{user.name} 
    </h:column> 
    <h:column> 
     <f:facet name="header">Currency</f:facet> 
      #{user.surname} 
    </h:column>     
</h:dataTable> 

其中物品是包含用戶的項目和一個數組,其中currentUser是User類型的會話範圍類對象。在第一個代碼中,當用戶登錄時,我從數據庫中獲取所有項目,並將它們添加到會話以供稍後使用,因爲我以這種方式填充表格。現在,第二個版本:

<h:dataTable binding="#{user.ITEMS}" style=" width:505px;" id="userTable" value="#{user.items}" var="user" > 
    <h:column> 

    </h:column> 
    <h:column> 
     <f:facet name="header">Account Number</f:facet> 
      #{user.name} 
    </h:column> 
    <h:column> 
     <f:facet name="header">Currency</f:facet> 
      #{user.surname} 
    </h:column>     
</h:dataTable> 

在第二個例子,我不保留的項目列表時用戶登錄到系統,但每當一個表來填充,我做的數據庫查詢,並通過填寫表格用戶的項目。

所以我的問題是,哪種方式更好?我發現在第一種情況下,使用大量會話對象可能會有害,但在第二種情況下,我們每次需要項目信息時都會進行數據庫搜索。那麼我們可以說在空間,時間等方面,一種方式比另一種更好嗎?

+1

您不應該在JSF中緩存。您應該在JPA中緩存。不要濫用HTTP會話來充當數據庫緩存。 – BalusC

回答

6

在會話作用域對象中緩存數據會導致提供陳舊數據的風險 - 如果另一個進程修改數據庫的內容,則會話作用域對象將不會反映這些更改。這聽起來不像是可變數據,但在這種情況下,這不是問題。

除此之外,由於數據保存在主存儲器中,所以在會話作用域對象中緩存數據的時間可能會更好,並且每次進入數據庫的空間可能會更好,因爲您不是將數據保存在內存中。 「可能」限定符在那裏,因爲數據庫可能會爲您緩存這些數據。

+0

謝謝,你是正確的,無論何時對項目進行更新,我需要創建新項目,將其添加到項目arraylist,然後用新的替換會話中的舊對象,很難提供陳舊的數據 – yrazlik

相關問題