我正在将我的应用程序从 Java 8 和 Spring Boot 2.7.18 迁移到 Java 17 和 Spring Boot 3.2.3。
我正在尝试迁移 EhCache(我使用此 link 进行迁移,因为我之前的配置符合“旧”定义),并且出现以下错误:
org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.cache.spi.CacheImplementor] due to: Cache provider not started
javax.cache.CacheException: Multiple CachingProviders have been configured when only a single CachingProvider is expected
现在最初我以为我配置了 EhCache 错误,但是后来我通过这个answer发现我的 Spring 应用程序默认使用 hazelcast 作为缓存提供程序,这导致了 ehcache 和 hazelcast (多个缓存提供程序)之间的冲突,当我启用EhCache。
但是,它在之前的 Java 8 和 Spring Boot 2 堆栈中并没有这样做,所以我想知道我可以做什么来禁用它,而不必求助于 这个答案,因为我不需要代码在我的春天主要。
注意,我确实在我的项目中有hazelcast,但它是通过application.yaml启用的,并且不应在应用程序启动时启用。
此外,我没有对我的代码进行任何更改(除了将 javax 更改为 jakarta),我只是更新依赖项的版本并更改 ehcache 的 yaml 属性。
我的pom包含以下依赖项:
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-spring</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-kubernetes</artifactId>
<version>${hazelcast-kubernetes.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate-ehcache.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>${hibernate-jcache.version}</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
有以下版本
<hazelcast-kubernetes.version>2.2.3</hazelcast-kubernetes.version>
<hazelcast.version>5.3.6</hazelcast.version>
<hibernate-ehcache.version>6.0.0.Alpha7</hibernate-ehcache.version>
<hibernate-jcache.version>6.4.4.Final</hibernate-jcache.version>
<ehcache.version>3.10.8</ehcache.version>
我使用了我之前提到的答案,它有积极的结果,但是我希望不必在我的 main 中使用代码来让 ehcache 正常工作,所以我希望 spring 不要将 hazelcast 视为我的默认缓存提供程序。
application.properties 中包含以下行来指定要使用哪一个:
spring.jpa.properties.hibernate.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
如果您不指定此属性,hibernate-jcache 将尝试自动发现提供程序。然后它找到了两个提供者(ECache和HZ),因此导致异常的发生。