日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > Caffe >内容正文

Caffe

spring boot 2.1.4 hibernate 二级缓存 Caffeine实现

發布時間:2023/12/14 Caffe 99 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring boot 2.1.4 hibernate 二级缓存 Caffeine实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。