springboot在引入hibernate之后,针对数据库操作,会配置二级缓存:
@Entity
@Table(name = "tt_xxxx_table")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class XxxxTableClazz implements Serializable {
.....
然而,缓存配置完成以后,有时候会遇到一些莫名其妙的异常:
Multiple CachingProviders have been configured when only a single CachingProvider is expected
原因是由于本来只需要实例化一个bean的实例,却被初始化了多次,其报错原因如下:
public CachingProvider getCachingProvider(ClassLoader classLoader) { Iterator<CachingProvider> iterator = this.getCachingProviders(classLoader).iterator(); if (iterator.hasNext()) { CachingProvider provider = (CachingProvider)iterator.next(); if (iterator.hasNext()) { throw new CacheException("Multiple CachingProviders have been configured when only a single CachingProvider is expected"); } else { return provider; } } else { throw new CacheException("No CachingProviders have been configured"); } }
由以上程序可知,错误原因便是iterator中存在多个实现了 CachingProvider的实例。
那么我们便可以查看一下程序中基于CachingProvider的实现类有哪些:
通过debugger调试可以知道:
确实有2个实例被加载进了iterator,从而会报出javax.cache.CacheException的错误。
此时检查项目pom.xml文件,发现项目在引入
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
的同时还引入了
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> </dependency>
而redisson的引入,由于java的spi机制,会再加载一次:
从而会导致有重复的CachingProvider出现。
那我们便有2个选择,保留redisson或者ehcache其中之一。
我选择的是注释掉redisson:
之后Reimport一下maven工程,便可以了