为什么EhCacheProvider被弃用了?

21

我正在配置我的Hibernate项目以使用第二级缓存提供程序,以便我可以利用查询缓存。

我添加了一个ehcache的依赖:

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

我认为我想要使用的提供程序类是:

net.sf.ehcache.hibernateEhCacheProvider

当我在Eclipse中查看引用的库时,我看到EhCacheProviderSingletonEhCacheProvider上有@Deprecated注释。这是怎么回事?是否有可以使用的最新替代提供程序?

我正在使用Hibernate版本3.4.0.GA,如果有影响的话。

4个回答

47

为什么?有没有一个最新的替代方案供我使用?

它们已被弃用,推荐使用实现了新的Hibernate 3.3/3.5 SPI及其CacheRegionFactory类的替代方案。这些实现分别是:

  • net.sf.ehcache.hibernate.EhCacheRegionFactory
  • net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

新SPI的好处包括:

  • SPI在Hibernate缓存管道中移除了同步。并且它留给缓存实现如何控制并发访问。自1.6版本开始,Ehcache采用CAS方法代替同步。对于繁重的工作负载,结果非常显著。
  • 新SPI提供了更细粒度的缓存区域存储和缓存策略控制。 Ehcache 2.0利用此功能来减少内存使用。它提供了只读、非严格读写和读写策略,全部都是集群安全的。
  • Ehcache 2.0与Terracotta Server Array一起使用时容易进行分布式处理。这样就可以进行集群安全操作(coherency)、高可用性(HA)和超越进程缓存的限制的扩展,这是大多数Hibernate用户目前使用Ehcache的方式。有现有的ehcache.jar和ehcache-terracotta.jar提供客户端库。

因此,建议您使用这些新实现。配置通过以下属性完成:

<property name="hibernate.cache.region.factory_class">
    net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
</property>

这将替换掉hibernate.cache.provider_class属性。

参考资料


由于找不到类:org.hibernate.cache.TimestampsRegion,此处无法工作。我在类路径上有ehcache、jcache和hibernate 5。 - mjs

17

如果您想要使用Hibernate 4.0.0.Final作为hibernate.cache.region.factory_class属性的值,请使用以下内容:

  • org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory代替net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
  • org.hibernate.cache.ehcache.EhCacheRegionFactory代替net.sf.ehcache.hibernate.EhCacheRegionFactory

否则,您将遇到一些内部ClassNotFound异常。


非常好的观点...以下是来自Terracotta工程师的原因: (http://forums.terracotta.org/forums/posts/list/6674.page --> 第二篇帖子) - skiabox

10

EhCache 2现已过时并已停止使用。您应该改用EhCache 3。在Hibernate 5.3之后的版本中,建议使用JSR-107(JCache)。为此,需要两个依赖项:

<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-jcache</artifactId>
     <version>your_hibernate_version</version>
</dependency>

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.6.3</version>
    <scope>runtime</scope>
</dependency>

第一个是提供符合Hibernate标准的JSR-107 API。第二个是实际的缓存实现-EhCache 3。
同时必须使用新的RegionFactory:
hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory

JCache是ehcache吗?我有点困惑。JCache是什么?为什么EcacheREgionFactory类仍未被弃用。它也没有读取EhCache.xml的配置文件。 - mjs
@mmm Ehcache从版本3.0开始是JCache API实现(也称JSR-107)。请查看Ehcache文档:https://www.ehcache.org/documentation/3.8/107.html - Michał Stochmal
这是否意味着我现在必须注释我的实体?以前我不需要这样做。我的旧配置现在无法工作。我在这里发布了一个新帖子:https://stackoverflow.com/questions/63484497/upgrading-to-hibernate-5-and-configuring-ehcache-not-working-jcache-now - mjs
1
2022年,针对遗留代码(不使用缓存注解)的Ehcache 3和Hibernate 5编程方法是一团死链接和混乱。JSR 107似乎只部分实现。由于我遇到了许多漏洞和类冲突,所以我不得不放弃Ehcache 3编程配置。Hibernate和Ehcache团队在不同的包结构中具有重复的类条目(例如EhCacheRegionFactory或何时使用hibernate-ehcache)。文档和示例很稀少且不充分。我正在阅读源代码来尝试理解发生了什么。 - BodhiOne
死胡同。无法收集依赖项:org.ehcache:ehcache:jar:3.10.8 -> org.glassfish.jaxb:jaxb-runtime:jar:2.3.0-b170127.1453 -> org.glassfish.jaxb:jaxb-core:jar:2.3.0-b170127.1453 -> javax.xml.bind:jaxb-api:jar:2.3.0-b161121.1438:无法读取javax.xml.bind:jaxb-api:jar:2.3.0-b161121.1438的构件描述符:无法从netbeans(http://bits.netbeans.org/nexus/content/groups/netbeans)传输javax.xml.bind:jaxb-api:pom:2.3.0-b161121.1438:未经授权,ReasonPhrase:存储库已停用。请参考https://netbeans.apache.org/about/oracle-transition.html。 - BodhiOne

6

EhCache文档指出,从Hibernate 3.3版本开始,应该使用:

<property name="hibernate.cache.region.factory_class">
    net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>

(或net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

1
FYI,EhCache文档链接已失效。 - Sridhar Sarnobat

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