JSF“缓存”一些预加载的变量

时间:2014-06-30 07:18:43

标签: jsf caching prerenderview

我有一个页面,它在每个“preRenderView”上填充一些带有DB值的列表

//preRenderView Method
public void init(){
    loadChapterStructure();
    loadCategoryStructure();
}    

由于事实,章节和类别实际上并不常见(例如,每天只有一次),因此只应为每个用户加载一次(在首页加载时)。

当用户现在在同一个视图上执行某些GET请求时(为了保持页面等可收藏),最好不要再次加载这些“静态”值。

有没有办法实现,例如加载章节和类别,例如每小时只有一次?这个问题有没有最好的做法?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以实现一个缓存DB值的@ApplicationScoped托管bean。只需通过它访问数据,而不是直接使用视图bean中的DAO:

@ManagedBean
@ApplicationScoped
public class CacheManager(){

    private static Date lastChapterAccess;

    private static Date lastCategoryAccess;

    private List<Chapter> cachedChapters; 

    private List<Category> cachedCategories; 

    private Dao dao;

    //Refresh the list if the last DB access happened 
    //to occur more than one hour before
    public List<Chapter> loadChapterStructure(){
        if (lastChapterAccess==null || new Date().getTime() 
            - lastChapterAccess.getTime() > 3600000){
            cachedChapters = dao.loadChapterStructure();
            lastChapterAccess = new Date();
        }
        return cachedChapters;
    }

    public List<Category> loadCategoryStructure(){
        if (lastCategoryAccess==null || new Date().getTime() 
            - lastCategoryAccess.getTime() > 3600000){
            cachedCategories = dao.loadCategoryStructure();
            lastCategoryAccess = new Date();
        }
        return cachedCategories;
    }


}

然后使用@ManagedProperty注释将bean注入所需的任何位置:

@ManagedBean
@ViewScoped
public class ViewBean{

    @ManagedProperty(value="#{cacheManager}")
    private CacheManager cacheManager;

    //preRenderView Method
    public void init(){
        chapters = cacheManager.loadChapterStructure();
        categories = cacheManager.loadCategoryStructure();
    }    

}