2009-07-23 43 views
0

說我有一個JSF支持bean,請求範圍,有一個List作爲成員。 在支持bean中,我有一個綁定到頁面上的按鈕的方法。基本緩存問題

當第一次按下按鈕時,該方法使用EJB來填充列表。 隨後按下按鈕,我不希望該方法調用數據庫。

所以,我添加了一個檢查:

if(list == null || list.size() == 0) 
    //populate the list 

否則,該列表將已經填充,所以沒有必要DB調用。 這對緩存機制來說是否令人滿意?

回答

1

因爲bean是請求範圍,所以它的成員將只存在於單個請求的生命週期中。所以,每次請求頁面時都會提取數據。

你可以做的一件事就是將緩存的數據放在不同的作用域(例如會話或應用程序)中。

<managed-bean> 
    <managed-bean-name>expensiveBean</managed-bean-name> 
    <managed-bean-class>lifetime.ExpensiveBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
    <managed-bean-name>requestBean</managed-bean-name> 
    <managed-bean-class>lifetime.RequestBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>cachedAsset</property-name> 
     <property-class>lifetime.ExpensiveBean</property-class> 
     <value>#{expensiveBean}</value> 
    </managed-property> 
    </managed-bean> 

示例代碼:

public class RequestBean { 

    private ExpensiveBean cachedAsset; 

    public ExpensiveBean getCachedAsset() { 
    return cachedAsset; 
    } 

    public void setCachedAsset(ExpensiveBean cachedAsset) { 
    this.cachedAsset = cachedAsset; 
    } 

} 

這樣的話,你可以很容易地從一個請求範圍豆,同時保持請求級文物單獨的參考的數據。

某些框架添加了對頁面範圍的支持,這會將數據與視圖的生命週期保持一致。這可能是另一種選擇,取決於您的需求。