Как настроить кэширование в компоненте EJB, где я запрашиваю базу данных с использованием шаблона гибернации?

Я запрашиваю базу данных из своего EJB Bean, который является DAO, мой запрос выглядит так:

public List findDirectories()
{
  allDirectories = getHibernateTemplate().find("from " + Directory.class.getName() +
        " d order by upper(d.name)";);
  return allDirectories;
}

Я хочу кэшировать эти результаты, как я могу это сделать, есть ли пример, на который я тоже могу сослаться. Все, что я хочу сделать, это в моем EBJ Bean кэшировать набор результатов вышеуказанного запроса, поэтому в следующий раз, когда страница обновится, я иду и получаю результаты из кеша, а не из базы данных.

Обновление: я использую более старые версии EJB и поэтому могу использовать cool features из EJB3


person Rachel    schedule 30.01.2012    source источник
comment
Можете ли вы использовать кеш второго уровня Hibernate? Он также включает кэш запросов.   -  person Luciano    schedule 31.01.2012
comment
Я работаю над использованием кеша Hibernate, пока просто использую статическую карту, чтобы она действовала как кеш...   -  person Rachel    schedule 31.01.2012


Ответы (1)


Общая идея состоит в том, чтобы использовать EJB-компоненты сеанса без сохранения состояния для кэширования редко изменяемых данных и управления ими. Время от времени обновляйте EJB, если данные, вопреки всем ожиданиям, изменяются.

В Java EE 6 реализована несколько иная техника, одноэлементные компоненты: http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview_Part3.html.

person Olaf    schedule 30.01.2012
comment
Я не использую ejb3 и поэтому не уверен, что смогу использовать этот подход. - person Rachel; 31.01.2012
comment
Я не использовал классические EJB уже почти десять лет, но я совершенно уверен, что подход с кэшированием данных в сеансовых EJB без сохранения состояния примерно так же стар, как и платформа EJB. - person Olaf; 31.01.2012
comment
Я использую сеансовые компоненты без сохранения состояния для реализации, но не уверен, как здесь будет работать кэширование, потому что я использую запрос гибернации для возврата данных из базы данных. - person Rachel; 31.01.2012
comment
@Rachel: я не уверен, какова ваша точная архитектура. Что-то вроде этого: static.springsource.org/spring/ docs/2.5.x/reference/ejb.html ? Если это так, у вас должно быть достаточно средств в методе setSessionContext() сессионного компонента без сохранения состояния для выполнения запроса Hibernate. Таким образом, вы можете получить все свои значения и сохранить их в переменной-члене типа List. Вы можете либо хранить объекты, отсоединенные от сеанса Hibernate, либо просто строки Java, которые впоследствии можно использовать в пользовательском интерфейсе или при построении критериев фильтрации. Надеюсь это поможет. - person Olaf; 31.01.2012
comment
на данный момент я только что создал карту и сохраняю информацию на карте, и я проверяю, что карта не пуста, затем получаю значения с карты или получаю их из базы данных, и в этом случае приложение займет некоторое время. - person Rachel; 31.01.2012
comment
@ Олаф, ссылка, которую вы предоставили, не работает. Пожалуйста, обновите ссылку. - person srh; 15.01.2016