2012-09-14 39 views
0

我最近开始构建JSF 2.0应用程序,我在想,如果有人可以帮助我的想法,我不得不使用它们。缓存对象和JSF

我有对象(从查找表拉),我知道这并不经常更改列表(假设国家的列表)。国家是一个列表的简单例子,它不会经常更改,但列表可能很容易变成例如每隔几周改变一次的对象。

在一个会话作用域的bean我最常做的是从数据库加载该列表。

现在我的问题是这样的:有什么办法保持这样一个清单(或课程的列表)中,经过一段时间后失效缓存和重新加载名单到期后? 希望有人会面临同样的“问题”,并可以分享他的经验!

在此先感谢!

回答

3

我不会做它在UI层,但使用的Ehcache而缓存你的查找方法。如果你使用hibernate,你可以使用它的二级缓存(也可以查询查询缓存)。如果你使用Spring,你可以很容易地标注您的服务方法是这样的:

@Cacheable("countries") 
public List<Country> findCountries(){ 
    // ... your lookup code here.... 
} 

您也可以缓存失效当一个国家被更新:

@CacheEvict(value = "countries", allEntries=true) 
public void saveCountry(Country country){ 
    // your code for saving a country 
} 
在ehcache.xml中,你可以

最后定义缓存的实时时间(timeToLiveSeconds)。你甚至可以定义它永远不应该失效(永恒=真),当你确定只能通过你的服务门面应用更改。

<cache name="countries" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120"/> 

更新1:

所以,你的支持bean本身甚至可以要求或视图作用域:

@ManagedBean 
@ViewScoped 
public class Bean{ 

    @Inject 
    private CountryService countryService; 

    public List<Country> getCountries(){ 
     return countryService.findCountries(); 
    } 

}