JSF "кеширует" некоторые предварительно загруженные переменные
У меня есть страница, которая заполняет на каждый "preRenderView" несколько списков со значениями БД
//preRenderView Method
public void init(){
loadChapterStructure();
loadCategoryStructure();
}
Из-за того, что главы и категории не очень часто встречаются (например, только один раз в день), их следует загружать только один раз для каждого пользователя (при загрузке первой страницы).
Когда пользователь теперь выполняет несколько GET-запросов в одном и том же представлении (для сохранения закладки страницы и т. Д.), Было бы хорошо не загружать эти "статические" значения снова.
Есть ли способ добиться, например, загрузки глав и категорий, например, только один раз в час? Есть ли лучшая практика по этому вопросу?
Спасибо за любую помощь!
1 ответ
Вы можете реализовать @ApplicationScoped
управляемый компонент, который кэширует значения БД. Просто получите доступ к данным через них, а не напрямую с помощью DAO из ваших bean-компонентов вида:
@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
аннотация:
@ManagedBean
@ViewScoped
public class ViewBean{
@ManagedProperty(value="#{cacheManager}")
private CacheManager cacheManager;
//preRenderView Method
public void init(){
chapters = cacheManager.loadChapterStructure();
categories = cacheManager.loadCategoryStructure();
}
}