基本缓存问题

时间:2009-07-23 17:36:02

标签: jsf caching

假设我有一个JSF支持bean,请求范围,它有一个List作为成员。 在支持bean中,我有一个绑定到页面上按钮的方法。

首次按下该按钮时,该方法使用EJB填充列表。 在后续按下按钮时,我不希望该方法调用DB。

所以,我添加了一张支票:

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

否则,列表已经填充,因此无需调用DB。 这对于缓存机制是否令人满意?

1 个答案:

答案 0 :(得分: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;
  }

}

这样,您可以轻松地引用请求范围bean中的数据,同时保持请求级别的工件分离。

某些框架添加了对页面范围的支持,从而使数据与视图的生命周期保持联系。根据您的需要,这可能是另一种选择。