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

}
Другие вопросы по тегам