2013-07-25 2 views
1

Несколько кэш связанных с Hibernate вопросы:Спящий режим кэширования на примере?

  1. При кэшировании L1 (кэширование на основе сеансов), как только сессия закроется кэш упал/очищено. Но с кэшированием L2 (приложение/глобальное/распределенное кэширование), когда кеш упадет/очищен/запущен? Есть ли способ очистить/очистить кэш L2 вручную/программно?
  2. Вы можете указать EhCacheCacheProvider для кеша L2. Но для конфигурации кешей EhCache требует конфигурационный файл ehcache.xml в пути к среде выполнения. Существуют ли конкретные имена для кэша Hibernate L2, которые я могу использовать для точной настройки их в ehcache.xml?
  3. Если программа A использует управляемый Hibernate объект (некоторое POJO в постоянном состоянии) и, таким образом, активно управляется/отслеживается Hibernate, а отдельное приложение (программа B) обновляет одну и ту же запись - автоматически обновляется Hibernate встроенный POJO? Например, мое веб-приложение fizz.war подключается к серверу MySQL и управляет постоянным экземпляром User (что соответствует таблице users в MySQL). В настоящее время электронный адрес этого пользователя: [email protected]. Затем, в то же время, buzz.war (другое веб-приложение) обновляет тот же адрес электронной почты users до [email protected]. Hibernate автоматически обновляет экземпляр User, чтобы содержать обновление?
+0

Я нашел ответ на # 2 (как настроить XML EhCache для использования с Hibernate) здесь: [http://ehcache.org/documentation/user-guide/hibernate](http://ehcache.орг/документация/пользователь руководство/спящий режим). Прямо из этого документа: «* Hibernate создает кеши, названные после полного имени объектов домена. Так, например, для создания кэша для' com.somecompany.someproject.domain.Country' создать запись конфигурации кэша, аналогичную следующей в ehcache.xml. *». –

+0

И здесь также: [https://community.jboss.org/wiki/ConfigureEhcacheAsASecondLevelCache?_sscc=t](https://community.jboss.org/wiki/ConfigureEhcacheAsASecondLevelCache?_sscc=t). –

ответ

0

Для # 1, пара мыслей:

  • Пусть основная реализации кэша (т.е. EHCache) сделать выселение для вас, используя такие понятия, как время (TimeToLive, TimeToIdle) или мощности (MaxelementInMemory) выселения ...
  • Если вы используете hibernate 3.x, вы можете получить доступ к методу evit *() непосредственно из объекта sessionFactory.
  • Или, если вы используете Hibernate 4.x, вы можете использовать методы evict *() как часть интерфейса org.hibernate.Cache (методы из SesisonFactory все еще существуют ... но устарели) (http://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/Cache.html#evictEntity(java.lang.String,%20java.io.Serializable)...So например, выселить все объекты из области кэша:.

    sessionFactory.getCache() evictEntityRegion (entitClass);

  • Наконец, много более привязан к основной реализации кэша (следовательно, не вполне рекомендуемой): вы можете получить дескриптор объекта ehcache CacheManager (обычно одноэлементный), а затем вывести записи таким образом ...

    CacheManager.getInstance(). ClearAll();

или

//remove things from a specific cache 
CacheManager.getInstance().getCache("cache").remove(); 

Для # 3, нет, спящий режим не будет знать, если основной БД бэкэнда обновляется другим приложением (и, следовательно, не будет в состоянии очистить кэш L2 для этого объект, который был обновлен извне) ... который восходит к # 1 ... вам нужно разумно очистить кэш L2 от обновления сущности buzz.war (если вы используете распределенное кэширование, такое как ehcache + terracotta, это может быть возможным ...)

Надеюсь, что это поможет.

Смежные вопросы