我有一个页面,它在每个“preRenderView”上填充一些带有DB值的列表
//preRenderView Method
public void init(){
loadChapterStructure();
loadCategoryStructure();
}
由于事实,章节和类别实际上并不常见(例如,每天只有一次),因此只应为每个用户加载一次(在首页加载时)。
当用户现在在同一个视图上执行某些GET请求时(为了保持页面等可收藏),最好不要再次加载这些“静态”值。
有没有办法实现,例如加载章节和类别,例如每小时只有一次?这个问题有没有最好的做法?
感谢您的帮助!
答案 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();
}
}