Spring:Hibernate + Ehcache

9

我正在使用Hibernate的Spring项目,并希望使用Ehcache实现二级缓存。我看到了许多实现这一目标的方法:

  1. spring-modules-cache介绍了@Cacheable注解。

  2. ehcache-spring-annotations是一个旨在成为spring-modules-cache的继承者的工具集。

  3. Hibernate cache被很好地集成到Hibernate本身中,可以使用@Cache注解来进行缓存。

  4. Programmatic cache使用代理。基于注解的配置很快就会变得受限或复杂(例如,多层注解嵌套)。

个人认为spring-modules-cache不够全面,因此我可能更倾向于考虑更积极开发的ehcache-spring-annotations。然而,Hibernate缓存似乎是最完整的实现(例如,读写缓存等)。

什么会激励您使用哪种工具集?请分享您的缓存经验...

2个回答

9

我们的项目使用选项3。我们将注释org.hibernate.annotations.Cache应用于我们在Ehcache中缓存的实体,使用ehcache.xml配置Ehcache,并在hibernate.cfg.xml中启用和配置Hibernate二级缓存

    <!-- Enable the second-level cache  -->
    <property name="hibernate.cache.provider_class">
        net.sf.ehcache.hibernate.EhCacheProvider
    </property>
    <property name="hibernate.cache.region.factory_class">
        net.sf.ehcache.hibernate.EhCacheRegionFactory
    </property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.use_structured_entries">true</property>     
    <property name="hibernate.cache.generate_statistics">true</property>

对于大多数实体,我们使用缓存并发策略CacheConcurrencyStrategy.TRANSACTIONAL

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)

我们的Maven项目使用Hibernate 3.3.2GA和Ehcache 2.2.0:
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.2.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.3.0.ga</version>
        <exclusions>
            <exclusion>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.2.1.ga</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>ejb3-persistence</artifactId>
        <version>3.3.2.Beta1</version>
    </dependency>

1
很酷,你觉得这个方案还满意吗?在尝试了选项1和2之后,我感觉它们仍然相当有限,不够简明扼要,这并不是我所希望的。 - Johan Sjöberg
我们配置Hibernate和Ehcache的经验相对顺利,直到我们在集群中启用同步RMI缓存复制。启用后,Hibernate开始抛出奇怪的异常。为了解决这些异常,我们启用了hibernate.cache.use_structured_entries。虽然后来的Hibernate版本可能没有这个问题,但当我们尝试解决这个问题时,我们的环境与Hibernate 3.5.6不兼容。 - Derek Mahar
1
我在https://dev59.com/8FDTa4cB1Zd3GeqPHTh2记录了这个经验。 - Derek Mahar
我们已经将Hibernate配置从hibernate.cfg.xml移动到Spring应用程序上下文中。详细信息请参见https://dev59.com/y1XTa4cB1Zd3GeqP1m1Y#5407890。 - Derek Mahar

3

Spring 3.1有一个新的内置缓存抽象。 点击这里了解更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接