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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate二级缓存(二)二级缓存实现原理简单剖析

發(fā)布時(shí)間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate二级缓存(二)二级缓存实现原理简单剖析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

hibernate二級(jí)緩存(二)二級(jí)緩存實(shí)現(xiàn)原理簡單剖析

在前面我們將過hibernate二級(jí)緩存類似于一個(gè)插件,將緩存的具體實(shí)現(xiàn)分離,緩存的具體實(shí)現(xiàn)是通過hibernate.cache.region.factory_class參數(shù)配置指定。本文只是對(duì)hibernate二級(jí)緩存的部分接口進(jìn)行簡單的解析,大致了解二級(jí)緩存的整體結(jié)構(gòu),二級(jí)緩存的內(nèi)部實(shí)現(xiàn)很復(fù)雜,如要深究請(qǐng)閱讀hibernate源碼。

1. hibernate二級(jí)緩存結(jié)構(gòu)

hibernate二級(jí)緩存涉及到如下幾個(gè)重要的接口:

  • RegionFactory
  • DomainDataRegion
  • EntityDataAccess
  • StorageAccess

1.1 RegionFactory獲取緩存的工廠,RegionFactory有如下幾個(gè)重要的方法:

public interface RegionFactory extends Service, Stoppable {//初始化方法void start(SessionFactoryOptions settings, Map configValues) throws CacheException;boolean isMinimalPutsEnabledByDefault();//緩存策略AccessType getDefaultAccessType();String qualify(String regionName);default CacheTransactionSynchronization createTransactionContext(SharedSessionContractImplementor session) {return new StandardCacheTransactionSynchronization( this );}long nextTimestamp();default long getTimeout() {// most existing providers defined this as 60 seconds.return 60000;}DomainDataRegion buildDomainDataRegion(DomainDataRegionConfig regionConfig,DomainDataRegionBuildingContext buildingContext);QueryResultsRegion buildQueryResultsRegion(String regionName, SessionFactoryImplementor sessionFactory);TimestampsRegion buildTimestampsRegion(String regionName, SessionFactoryImplementor sessionFactory); }
  • start 初始化RegionFactory
  • getDefaultAccessType 獲得緩存策略,前面說過的CacheConcurrencyStrategy內(nèi)部是基于AccessType
  • nextTimestamp 生成時(shí)間戳,用于時(shí)間戳緩存
  • buildDomainDataRegion 創(chuàng)建一個(gè)實(shí)體領(lǐng)域模型的Region,使用該對(duì)象來緩存實(shí)體,可以理解為實(shí)體緩存的holder
  • buildQueryResultsRegion 創(chuàng)建查詢緩存
  • buildTimestampsRegion 創(chuàng)建時(shí)間戳緩存。時(shí)間戳緩存Region存放了對(duì)于查詢結(jié)果相關(guān)的表進(jìn)行插入, 更新或刪除操作的時(shí)間戳。Hibernate 通過時(shí)間戳緩存Region來判斷被緩存的查詢結(jié)果是否過期

RegionFactory 是創(chuàng)建緩存的工廠,所有的緩存都是通過RegionFactory 來獲取的,而RegionFactory 是在EnabledCaching構(gòu)造方法中初始化的。RegionFactory 的初始化過程如下圖所示:

sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();可以看到是在初始化sessionFactory的時(shí)候來初始化RegionFactory 。

1.2 DomainDataRegion緩存區(qū)域

DomainDataRegion可以理解為緩存的wraper或者h(yuǎn)older。接口如下:

public interface DomainDataRegion extends Region {EntityDataAccess getEntityDataAccess(NavigableRole var1);NaturalIdDataAccess getNaturalIdDataAccess(NavigableRole var1);CollectionDataAccess getCollectionDataAccess(NavigableRole var1); }

getEntityDataAccess 獲得一個(gè)EntityDataAccess,對(duì)緩存的操作實(shí)際上是代理給EntityDataAccess,由EntityDataAccess來真正的管理緩存。

1.3 EntityDataAccess 緩存實(shí)際的訪問者,用于管理對(duì)緩存實(shí)體數(shù)據(jù)的事務(wù)性和并發(fā)訪問的協(xié)定

public interface EntityDataAccess extends CachedDomainDataAccess {//生成緩存keyObject generateCacheKey(Object id,EntityPersister rootEntityDescriptor,SessionFactoryImplementor factory,String tenantIdentifier);//獲取緩存keyObject getCacheKeyId(Object cacheKey);//在查詢后,是否將查詢結(jié)果插入緩存boolean insert(SharedSessionContractImplementor session, Object key, Object value, Object version);//插入后是否更新緩存boolean afterInsert(SharedSessionContractImplementor session, Object key, Object value, Object version);boolean update(SharedSessionContractImplementor session,Object key,Object value,Object currentVersion,Object previousVersion);boolean afterUpdate(SharedSessionContractImplementor session,Object key,Object value,Object currentVersion,Object previousVersion,SoftLock lock); }

在上面的接口中我們并沒有看到實(shí)際操作緩存的接口,那么EntityDataAccess 又是怎么訪問和管理緩存的呢,下面來看一下EntityDataAccess 的接口繼承和實(shí)現(xiàn)關(guān)系:

從上面的圖我們可以看到EntityDataAccess 有一個(gè)抽象類,4個(gè)實(shí)現(xiàn)類。4個(gè)實(shí)現(xiàn)類分別對(duì)應(yīng)了4中緩存訪問類型,READ_ONLY,TRANSACTIONAL,READ_WRITE,NONSTRICT_READ_WRITE。抽象類AbstractEntityDataAccess實(shí)現(xiàn)了
EntityDataAccess 繼承了AbstractCachedDomainDataAccess。AbstractCachedDomainDataAccess的部分代碼如下:


AbstractCachedDomainDataAccess里面包含了一個(gè)DomainDataStorageAccess,DomainDataStorageAccess繼承自StorageAccess,StorageAccess的接口如下:

public interface StorageAccess {/*** Get an item from the cache.*/Object getFromCache(Object key, SharedSessionContractImplementor session);/*** Put an item into the cache*/void putIntoCache(Object key, Object value, SharedSessionContractImplementor session);/*** Remove an item from the cache by key*/default void removeFromCache(Object key, SharedSessionContractImplementor session) {evictData( key );}/*** Clear data from the cache*/default void clearCache(SharedSessionContractImplementor session) {evictData();}/*** Does the cache contain this key?*/boolean contains(Object key);/*** Clear all data regardless of transaction/locking*/void evictData();/*** Remove the entry regardless of transaction/locking*/void evictData(Object key);/*** Release any resources. Called during cache shutdown*/void release(); }

到這里我們終于發(fā)現(xiàn)了操作緩存的實(shí)際接口。而DomainDataStorageAccess接口是緩存操作必須實(shí)現(xiàn)的接口,ehchche的實(shí)現(xiàn)類是StorageAccessImpl。當(dāng)然通過擴(kuò)展該接口我們還可以將緩存放置到redis,memcache。

2. 緩存的初始化和調(diào)用

2.1 從上面的接口關(guān)系我們大致可以得到如下的一個(gè)緩存初始化關(guān)系鏈:

sessionFactory ----->EnabledCaching ----->RegionFactory ----->DomainDataRegion ----->EntityDataAccess ----->AbstractEntityDataAccess ----->AbstractCachedDomainDataAccess ----->StorageAccess

2.2 獲取cache的調(diào)用棧


SessionImpl獲取實(shí)體對(duì)象,然后通過一系列的調(diào)用,最終會(huì)落到AbstractCachedDomainDataAccess.get(SharedSessionContractImplementor session, Object key),前面已經(jīng)說過該方法實(shí)際上是調(diào)用的DomainDataStorageAccess.getFromCache( key, session )。

3. 自定義hibernate緩存

通過前面的一系列分析,我們大致了解了hibernate緩存的一些重要的接口。如果要自定義hibernate緩存那么我們必須實(shí)現(xiàn)上面的這些接口。好在hibernate內(nèi)部為實(shí)現(xiàn)了大多數(shù)的擴(kuò)展,我們只需要擴(kuò)展RegionFactory和DomainDataStorageAccess接口既可以自定義hibernate的二級(jí)緩存。
hibernate為實(shí)現(xiàn)RegionFactory提供了一個(gè)模版類RegionFactoryTemplate,我們直接通過實(shí)現(xiàn)該類和DomainDataStorageAccess,即可自定義hibernate二級(jí)緩存。

總結(jié)

以上是生活随笔為你收集整理的hibernate二级缓存(二)二级缓存实现原理简单剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。