启用hibernate 缓存application.yml配置:
spring: jpa: properties: javax: persistence: sharedCache: mode: ENABLE_SELECTIVE hibernate: cache: use_query_cache: true use_second_level_cache: true region: factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
sharedCacheModel:
ENABLE_SELECTIVE,默认值,除非被@Cacheable显式声明要缓存,否则默认不缓存
DISABLE_SELECTIVE,除非被@Cacheable显式声明不缓存,否则默认缓存
ALL,总是被缓存
NONE,总是不缓存
hibernate实现中只有三种缓存类型:
一级缓存:默认启用,无法关闭,session级别, 同一个session内部,一级缓存生效,同一个id的对象只有一个。不同session,一级缓存无效
二级缓存: sessionFactory级别,使用方式有两种:第一种不使用hibernate的@cache标记,直接在实体上用@cacheable(javax.persistence.Cacheable)标记并且要配置缓存配置项: javax.persistence.sharedCache.mode:ENABLE_SELECTIVE, 第二种用hibernate的@cache标记使用,
1、二级缓存针对列表数据默认只缓存id,再通过id从数据库中查找
2、二级缓存缓存的仅仅是对象,如果查询出来的是对象的一些属性,则不会被加到缓存中去
3、 只有当 HQL 查询语句完全相同时,连参数设置都要相同,此时查询缓存才有效
查询缓存: 使用方式 queryImpl.setCacheable(true);必须设置才会生效
查询缓存缓存的也仅仅是对象的id,所以第一条 sql 也是将对象的id都查询出来,但是当我们后面如果要得到每个对象的信息的时候,此时又会发sql语句去查询,所以,如果要使用查询缓存,我们一定也要开启我们的二级缓存,这样就不会出现 N+1 问题了
private void setHibernateQuery(Query query) { if (query instanceof QueryImpl) { QueryImpl queryImpl = (QueryImpl ) query; queryImpl.setCacheable(true); } }
ehcache.xml配置文件:
org.springframework.cache.annotation.Cacheable注解使用异常问题:
java.lang.IllegalArgumentException: Cannot find cache named '缓存名' for Builder[加了cacheable注解的方法名] caches=[缓存名] | key='#groupName' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
@Cacheable(value = "findByGroup", key = "#groupName")
如果findByGroup未在ehcache.xml中配置,会出现无法找到缓存名的异常,可以使用CaffeineCacheManager或其他的缓存组件作为应用层缓存替换掉EhCacheCacheManager,就可以不用配置缓存名了,数据库缓存还是使用的ehcache,不会产生影响
@EnableCaching@Configurationpublic class BcCacheManagerConfig { @Bean @ConditionalOnMissingBean(CacheManager.class) public CaffeineCacheManager caffeineCacheManager() { return new CaffeineCacheManager(); }}
相关包引入
---------------------------------------------------------------------------- org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE org.springframework.boot spring-boot-starter-cache com.github.ben-manes.caffeine caffeine org.hibernate hibernate-ehcache net.sf.ehcache ehcache-core