The Ehcache second-level cache provider for Hibernate is deprecated

当我们使用hibernate-ehcache包(Ehcache 2)作为hibernate二级缓存时,系统会提示警告说已经过时了,那这时候找到spring boot推荐的新的二级缓存方案,现在推荐hibernate-jcache,可以与Ehcache 3或是其他实现了javax.cache.spi.CachingProvider的缓存自动集成

jcache是一种缓存门面规范,并不包含具体缓存实现,spring boot推荐与jcache搭配使用的是Hazelcast,Hazelcast实现了CachingProvider,可以直接作为hibernate二级缓存,Hazelcast实现下一篇再提供

hibernate二级缓存重构之后,要自己实现也非常简单,只需要实现

org.hibernate.cache.spi.support.RegionFactoryTemplate

org.hibernate.cache.spi.support.DomainDataStorageAccess

这两个类就可以了,引入caffeine包

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency>

下面是DomainDataStorageAccess实现,这个类就是缓存操作的实现

import java.util.concurrent.TimeUnit;import org.apache.commons.lang3.StringUtils;
import org.hibernate.cache.spi.support.DomainDataStorageAccess;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;import lombok.NonNull;public class CaffeineDataRegion implements DomainDataStorageAccess {protected final Logger log = LoggerFactory.getLogger(this.getClass());/*** Region regionName*/private final String regionName;private final Cache<Object, Object> cache;private final int expiryInSeconds; // secondsstatic final int DEFAULT_EXPIRY_IN_SECONDS = 1800;public CaffeineDataRegion(@NonNull String regionName) {this.regionName = StringUtils.replace(regionName, ".", ":") + ":";this.expiryInSeconds = DEFAULT_EXPIRY_IN_SECONDS;cache = Caffeine.newBuilder()// 设置cache中的数据在写入之后的存活时间.expireAfterWrite(30, TimeUnit.MINUTES)// 构建cache实例.build();log.debug("caffeiene region={}, expiryInSeconds={}", regionName, expiryInSeconds);}/*** confirm the specified key exists in current region** @param key*            cache key* @return if cache key is exists in current region return true, else return*         false*/@Overridepublic boolean contains(Object key) {try {log.debug("contains key={}", key);return cache.getIfPresent(key) != null;} catch (Exception ignored) {log.warn("Fail to exists key. key=" + key, ignored);return false;}}@Overridepublic Object getFromCache(Object key, SharedSessionContractImplementor session) {try {return cache.getIfPresent(key);} catch (Exception ignored) {log.warn("Fail to get cache item... key=" + key, ignored);return null;}}@Overridepublic void putIntoCache(Object key, Object value, SharedSessionContractImplementor session) {try {cache.put(key, value);} catch (Exception ignored) {log.warn("Fail to put cache item... key=" + key, ignored);}}@Overridepublic void evictData() {try {cache.invalidateAll();} catch (Exception ignored) {log.warn("Fail to clear region... name=" + regionName, ignored);}}@Overridepublic void evictData(Object key) {try {cache.invalidate(key);} catch (Exception ignored) {log.warn("Fail to remove cache item... key=" + key, ignored);}}@Overridepublic void release() {}
}

下面是RegionFactoryTemplate实现,这个类是缓存启动类

import java.util.Map;import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.cache.cfg.spi.DomainDataRegionBuildingContext;
import org.hibernate.cache.cfg.spi.DomainDataRegionConfig;
import org.hibernate.cache.spi.support.DomainDataStorageAccess;
import org.hibernate.cache.spi.support.RegionFactoryTemplate;
import org.hibernate.cache.spi.support.StorageAccess;
import org.hibernate.engine.spi.SessionFactoryImplementor;import com.bc.plugin.caffeine.hibernate.regions.CaffeineDataRegion;import lombok.extern.slf4j.Slf4j;@Slf4j
public class CaffeineRegionFactory extends RegionFactoryTemplate {private static final long serialVersionUID = 1L;@Overrideprotected StorageAccess createQueryResultsRegionStorageAccess(String regionName,SessionFactoryImplementor sessionFactory) {return new CaffeineDataRegion(regionName);}@Overrideprotected StorageAccess createTimestampsRegionStorageAccess(String regionName,SessionFactoryImplementor sessionFactory) {return new CaffeineDataRegion(regionName);}@Overrideprotected DomainDataStorageAccess createDomainDataStorageAccess(DomainDataRegionConfig regionConfig,DomainDataRegionBuildingContext buildingContext) {return new CaffeineDataRegion(regionConfig.getRegionName());}@Overrideprotected void prepareForUse(SessionFactoryOptions settings, @SuppressWarnings("rawtypes") Map configValues) {log.debug("RegionFactory is starting... options={}, properties={}", settings, configValues);}@Overrideprotected void releaseFromUse() {}
}

然后配置spring.jpa.properties.hibernate.cache.region.factory_class=/*org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory  */

org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory是hibernate-ehcache包中的实现,

替换成我们CaffeineRegionFactory类的全路径就可以了

引入caffeine包后,spring cache也会使用caffeine,springboot会自动配置caffeine

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

spring boot 2.1.4 hibernate 二级缓存 Caffeine实现相关推荐

  1. spring boot 2.1.4 hibernate二级缓存 Hazelcast实现(一)

    Hazelcast优势网上都可以查到,默认的分布式缓存,使用Hazelcast替换ehcache优势比较明显,也方便项目从单机到发展分布式,而不用再引入其他组件也达到了性能要求,按照springboo ...

  2. spring boot集成ehcache 2.x 用于hibernate二级缓存

    spring boot集成ehcache 2x 用于hibernate二级缓存 项目依赖 Ehcache简介 hibernate二级缓存配置 ehcache配置文件 ehcache事件监听 注解方式使 ...

  3. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  4. Hibernate二级缓存的使用

    1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率 ...

  5. Hibernate 二级缓存使用

    1启用Hibernate二级缓存 Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率 ...

  6. Hibernate EHCache - Hibernate二级缓存

    Hibernate EHCache - Hibernate二级缓存 欢迎使用Hibernate二级缓存示例教程.今天我们将研究Hibernate EHCache,它是最受欢迎的Hibernate二级缓 ...

  7. HibernateEHCache –Hibernate二级缓存

    Welcome to the Hibernate Second Level Cache Example Tutorial. Today we will look into Hibernate EHCa ...

  8. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  9. Spring boot 2.4开启静态资源缓存

    Spring boot 2.4开启静态资源缓存 yml配置: spring:web:resources:cache:cachecontrol:no-store: falsemax-age: 10000 ...

  10. Hibernate二级缓存问题

    相关概念和定义 1.缓存的意义 把一些不常修改,但是又经常用的数据存放到内存中,这样能减少与数据库的交互,提升程序的性能 2.Hibernate中提供了两级缓存: 第一级别的缓存是Session级别的 ...

最新文章

  1. 拥抱AI大趋势,ARM发布两款AI芯片架构
  2. java命名规则_Java命名规则
  3. 读书笔记之快速排序(一)
  4. 解决incorrect 'only available in ES6' warning (W119) with options `moz: true, esversion: 6` 报错问题...
  5. 鸿蒙开发-在JS中获取hml页面中Input输入的值
  6. SQL CE 3.0 与SQL CE 3.5区别
  7. Leetcode143. Reorder List重排链表
  8. C++ vector用法
  9. hibernate配置多数据源
  10. 再回首,Java温故知新(六):Java基础之变量
  11. concat效率 mysql_MYSQL数据库mysql中or效率高还是in效率高
  12. emqx-Clientid认证
  13. 物联网嵌入式——学习分享
  14. IDEA左侧目录,按照文件夹排序
  15. 无损音乐下载器 Delphi版
  16. qq空间进入游戏显示服务器拒绝,显示ptlogin2.qq.com,QQ空间打不开的快速解决办法...
  17. java美元转换人民币代码,java实现人民币数字转换中文大写的工具实例代码demo分享...
  18. 关于MySQL数据类型定义的几个细节-INT(N)/VARCHAR(N)/DECIMAL(M,N)
  19. 新浪云、腾讯云、阿里云、百度云、谷歌云、亚马逊云的区别是什么,哪个更适合国内创业者使用?
  20. 【定义】三角形行列式和对角行列式

热门文章

  1. 物联网感知-基于分布式光纤传感的石油石化管道综合监测
  2. docker安装,下载docker镜像
  3. PuttyPsftp命令行实现自动登录
  4. spring boot启动加载tomcat原理深度剖析
  5. linux 桌面时间,桌面锁屏时钟下载-桌面锁屏时钟appv2.8.1-Linux公社
  6. android 盒子刷机,DIY封装Android盒子刷机镜像
  7. 蓝桥杯真题:杨辉三角形
  8. IT加速营-关于java开发,测试及职业规划的公众号
  9. 台湾19大IT业营收连衰 全球产业景气警报先兆
  10. vue导出数据为Excel文件