Настройка Spring Hibernate Ehcache - PullRequest
2 голосов
/ 19 марта 2011

У меня возникли некоторые проблемы с получением кэш-памяти второго уровня для кеширования объектов домена.Согласно ehcache documentation не должно быть слишком сложно добавить кеширование в мое существующее рабочее приложение.

У меня есть следующие настройки (выделены только соответствующие фрагменты):

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
public void Entity {
    // ... 
}

ehcache-entity.xml

<cache name="com.company.Entity" eternal="false"
    maxElementsInMemory="10000" overflowToDisk="true" diskPersistent="false"
    timeToIdleSeconds="0" timeToLiveSeconds="300"
    memoryStoreEvictionPolicy="LRU" />

ApplicationContext.xml

<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="ds" />
    <property name="annotatedClasses">
        <list>
            <value>com.company.Entity</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="net.sf.ehcache.configurationResourceName">/ehcache-entity.xml</prop>
            <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>
            .... 
    </property>
</bean>

Зависимости Maven

   <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.4.0.GA</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-hibernate3</artifactId>
        <version>2.0.8</version>
        <exclusions>
            <exclusion>
                <artifactId>hibernate</artifactId>
                <groupId>org.hibernate</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.3.2</version>
    </dependency>

Используется тестовый класс, который включает статистику кэша:

    Cache cache = cacheManager.getCache("com.company.Entity");
    cache.setStatisticsAccuracy(Statistics.STATISTICS_ACCURACY_GUARANTEED);
    cache.setStatisticsEnabled(true);
    // store, read etc ... 
    cache.getStatistics().getMemoryStoreObjectCount(); // returns 0

Кажется, что никакая операция не вызывает каких-либо изменений в кэше.Что мне не хватает?В настоящее время я использую HibernateTemplate в DAO, возможно, это имеет некоторое влияние.

[EDIT]

Единственный вывод журнала ehcache при установке на DEBUG:

SettingsFactory: Cache region factory : net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

Ответы [ 5 ]

2 голосов
/ 20 марта 2011

Вам нужно вручную указать Hibernate использовать провайдера EHCache?Я никогда не был уверен, требуется ли это, но Hibernate поддерживает несколько провайдеров кеша, поэтому я подозреваю, что может потребоваться явно указать Hibernate, какой именно вы хотите.Попробуйте добавить это свойство в ApplicationContext.xml :

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
1 голос
/ 20 апреля 2011

Было выявлено несколько причин:

  1. Правильные зависимости maven:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.3.Final</version>
    </dependency>
    
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.4.1</version>
    </dependency>
    
  2. Добавлена ​​аннотация @Cacheableот javax.persistence до моих сущностей.

  3. Чтение журнала из режима гибернации вместо ehcache.

    getSessionFactory().getStatistics().logSummary();

  4. Не все операции гибернации влияют на кэш,Это мне нужно читать дальше.

0 голосов
/ 14 августа 2018

В hibernate.cfg.xml добавить:

 <hibernate-configuration>
   <session-factory>
     ...
     <property name="cache.use_second_level_cache">true</property>
     <property name="cache.use_query_cache">true</property>
     <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
0 голосов
/ 21 апреля 2011

вы можете ссылаться на следующие настройки

<prop key="hibernate.cache.use_query_cache">true</prop>
0 голосов
/ 21 марта 2011

Глядя на ваш конфиг, все кажется вполне нормальным. Единственное, на что стоит обратить внимание, это то, что при использовании HibernateTemplate вам необходимо явно установитьCacheQueries (true), если вы планируете использовать кеш запросов ... Что я бы не рекомендовал, за исключением случаев, когда вам действительно это нужно : http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html#setCacheQueries(boolean)

Вы пробовали статистику Hibernate вместо статистики Ehcache? Вы там пропускаете кеш? (я спрашиваю, почему вы используете тот же CacheManager, что и Hibernate) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...