Совместное использование локального ehcache среди нескольких веб-приложений Tomcat - PullRequest
4 голосов
/ 01 октября 2011

У меня есть 2 разных веб-приложения, работающих в одном экземпляре Tomcat 6. Оба совместно используют библиотеку, которая использует Hibernate для сохранения. Я хочу включить кэширование Hibernate 2-го уровня с помощью ehcache, но не хочу, чтобы у каждого веб-приложения был свой кэш.

Есть идеи, как мне это реализовать? Я установил ehcache-core в $ CATALINA_HOME / lib, и каждое весеннее приложение настраивает hibernate для использования ehcache следующим образом:

<property name="hibernateProperties">
<props>    
    <prop key="hibernate.cache.use_second_level_cache">true</prop>
    <prop key="hibernate.cache.use_query_cache">true</prop>
    <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>
</props>
</property>

Оба приложения используют ehcache, но у каждого по-прежнему есть свой отдельный кэш (измените элемент в одном приложении, а устаревшее значение все еще отображается в другом приложении)

Мой ehcache.xml (также в $ CATALINA_HOME / lib) выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         name="mySharedCache"
         updateCheck="false" monitoring="autodetect"
         dynamicConfig="false">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache maxElementsInMemory="10000"
                  eternal="false"
                  timeToIdleSeconds="120"
                  timeToLiveSeconds="120"
                  overflowToDisk="true"
                  diskPersistent="false"
                  diskExpiryThreadIntervalSeconds="120">
    </defaultCache
</ehcache>

Подробнее:

  • Tomcat 6
  • Пружина 3.0.5
  • Hibernate 3.6.5
  • EhCache 2.4.5

1 Ответ

4 голосов
/ 01 октября 2011

Возможно настроить EhCache для использования в кластерной среде.Каждое приложение будет иметь свой собственный кеш, но изменения одного кеша реплицируются на другие в кластере.Чтобы использовать JGroups для этой цели, вы можете добавить что-то вроде следующего в ваш файл ehcache.xml:

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory" properties="connect=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32; mcast_send_buf_size=150000;mcast_recv_buf_size=80000): PING(timeout=2000;num_initial_members=6): MERGE2(min_interval=5000;max_interval=10000): FD_SOCK:VERIFY_SUSPECT(timeout=1500): pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000): UNICAST(timeout=5000): pbcast.STABLE(desired_avg_gossip=20000): FRAG: pbcast.GMS(join_timeout=5000;join_retry_timeout=2000; shun=false;print_local_addr=true)" propertySeparator="::"/>

Затем добавьте следующее в элемент defaultcache:

<cacheEventListenerFactory class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=true, replicateRemovals=true"/>

Я узнал об этомиз главы в Java Persistence с Hibernate, которую я бы рекомендовал прочитать.В нем говорится, что приведенный выше пример взят из документации EhCache.

Если вы не хотите, чтобы у каждого приложения был свой кэш, прочитайте Infinispan.

...