1

我最近开始构建一个 JSF 2.0 应用程序,我在想是否有人可以帮助我解决我的想法。

我有一个对象列表(从查找表中提取),我知道它不会经常更改(比如说国家列表)。国家/地区是一个不经常更改的列表的简单示例,但该列表很容易成为例如每隔几周更改一次的对象。

在会话范围的 bean 中,我通常做的是从数据库中加载该列表。

现在我的问题是:有没有办法将这样的列表(当然是列表)保存在一段时间后过期的缓存中,并在过期后重新加载这个列表?希望有人会面临同样的“问题”并可以分享他的经验!

提前致谢!

4

1 回答 1

4

我不会在 UI 层这样做,而是使用 ehcache 缓存您的查找方法。如果您使用休眠,您可以使用它的二级缓存(也可以查找查询缓存)。如果您使用 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)。当您确定更改只能通过您的服务外观应用时,您甚至可以定义它永远不应该失效(eternal=true)。

<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();
    }

}
于 2012-09-14T21:12:46.370 回答