博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring boot 2.0.1.RELEASE hibernate 缓存 ehcache 详解
阅读量:6813 次
发布时间:2019-06-26

本文共 2906 字,大约阅读时间需要 9 分钟。

hot3.png

启用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

 

转载于:https://my.oschina.net/u/1428688/blog/2962103

你可能感兴趣的文章
利用jira-python及selenium完成jira的统计报表及日报的填写
查看>>
事件绑定完整版2016/4/21
查看>>
Devextreme 与 Angular6 兼容问题解决
查看>>
JS基础
查看>>
【转载】利用向量积(叉积)计算三角形的面积和多边形的面积
查看>>
CentOS 7安装Mysql并设置开机自启动
查看>>
1491: [NOI2007]社交网络
查看>>
编译安装nginx,并使用systemd管理nginx
查看>>
红和绿
查看>>
IE 兼容性写法
查看>>
MSDN URL 重写
查看>>
使用go语言开发一个后端gin框架的web项目
查看>>
readonly 关键字与 const 关键字不同
查看>>
chrome失去响应问题
查看>>
PHP中使用了mcrypt_decrypt函数处理Json Json_decode 返回空值或者 NULL 的问题 json_last_error 3...
查看>>
Hive基本原理及环境搭建
查看>>
用到位运算的题目
查看>>
BOJ 2773 第K个与m互质的数
查看>>
poj1273最大流初破
查看>>
hadoop namenode启动失败
查看>>