【问题标题】:Spring + Hibernate ehcache second level cacheSpring + Hibernate ehcache 二级缓存
【发布时间】:2015-09-08 11:03:53
【问题描述】:

我使用的是 Spring 4.1.1 版和 Hibernate 4.3.7 版,我正在使用注释与数据库进行映射。现在想集成Hibernate二级缓存。

<props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext
        </prop>
        <prop key="hibernate.show_sql">false</prop>
        <prop key="hibernate.hbm2ddl.auto">update</prop>


    </props>

我正在使用 Hibernate 依赖项

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.7.Final</version>
    </dependency>

这是我正在查询的类文件

@Entity
@Table(name = "assets")
public class Assets {

@Id
@Column(name = "assetID")
private Integer assetID;

@Column(name = "assetName")
private String assetName;
}

最后的休眠查询是

sessionFactory.getCurrentSession()
            .createQuery("from Assets").setCacheable(true).list();

请告诉我该怎么做。提前致谢。

【问题讨论】:

    标签: spring hibernate maven ehcache


    【解决方案1】:

    你需要在你的spring配置文件中配置二级缓存

    <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">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
    

    即使您仅使用查询缓存,您也需要注释您的实体,因为它会将结果存储在二级缓存中。

    @Entity
    @Table(name = "assets")
    @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class Assets {
    ....
    }
    

    您还需要一个xml文件来配置缓存区域(ehcache.xml),这里是一个默认的缓存区域配置for more details

    <ehcache>
       <diskStore path="java.io.tmpdir"/>
       <defaultCache
          maxEntriesLocalHeap="10000"
          eternal="false"
          timeToIdleSeconds="120"
          timeToLiveSeconds="120"
          maxEntriesLocalDisk="10000000"
          diskExpiryThreadIntervalSeconds="120"
          memoryStoreEvictionPolicy="LRU">
          <persistence strategy="localTempSwap"/>
       </defaultCache>
    </ehcache>
    

    更新:

    这对我有用:

    <!-- EHCache-Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>4.3.8.Final</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.9</version>
        </dependency>
    

    【讨论】:

    • 感谢您的回答,但是当我将它包含在 Spring 框架中时,它无法识别 ehcache,所以请告诉我这个 jar 或 XMLNS 的位置。