国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術文章
文章詳情頁

MyBatis緩存實現(xiàn)原理及代碼實例解析

瀏覽:128日期:2023-10-23 08:10:51

一、一級緩存(本地緩存)

sqlSession級別的緩存。一級緩存是一直開啟的;SqlSession級別的一個Map與數(shù)據(jù)庫同一次會話期間查詢到的數(shù)據(jù)會放在本地緩存中。以后如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,沒必要再去查詢數(shù)據(jù)庫;

一級緩存失效情況(沒有使用到當前一級緩存的情況,效果就是,還需要再向數(shù)據(jù)庫發(fā)出查詢):

1、sqlSession不同

2、sqlSession相同,查詢條件不同。(當前一級緩存中還沒有這個數(shù)據(jù))

3、sqlSession相同,兩次查詢之間執(zhí)行了增刪改操作(這次增刪改可能對當前數(shù)據(jù)有影響)

4、sqlSession相同,手動清除了一級緩存。

二、二級緩存(全局緩存)

基本namespace級別的緩存:一個namespace對應一個二級緩存:

工作機制:

1、一個會話,查詢一條數(shù)據(jù),這個數(shù)據(jù)就會被放在當前會話的一級緩存中:

2、如果會話關閉:一級會話中的緩存會被保存到二級緩存中;新的會話查詢信息,就可以參照二級緩存中的內(nèi)容。

3、不同namespace查出的數(shù)據(jù)會放在自己對應的緩存中(map)

效果:數(shù)據(jù)會從二級緩存中獲取,查出的數(shù)據(jù)會默認先放在一級緩存中,只有會話提交或者關閉以后,一級緩存中的數(shù)據(jù)才會轉移到二級緩存中

4、如何開啟二級緩存:

①開啟全局二級緩存配置:

<setting name='cacheEnabled' value='true'/>

②去mapper.xml中配置使用二級緩存:

<cache></cache>

③對應的POJO實現(xiàn)序列化接口

5、和緩存有關的設置屬性

①cacheEnabled=true:false:關閉緩存(二級緩存關閉)(一級緩存一直可用的)

②每個select標簽都有useCache='true':false:不使用緩存(一級緩存依然使用,二級緩存不使用)

③ 每個增刪改標簽的:flushCache='true':(一級二級都會清除)

④sqlSession.clearCache();只是清楚當前session的一級緩存;

⑤全局配置localCacheScope:

本地緩存作用域:(一級緩存SESSION);當前會話的所有數(shù)據(jù)保存在會話緩存中;

STATEMENT:可以禁用一級緩存。

6、第三方緩存整合

①導入第三方緩存包即可;

②導入與第三方緩存整合的適配包;官方有;

③mapper.xml中使用自定義緩存

使用Ehcache緩存框架

<cache type='org.mybatis.caches.ehcache.EhcacheCache'></cache>

7、cache標簽配置參數(shù): 

<cache eviction='FIFO' flushInterval='60000' readOnly='false' size='1024'></cache>

eviction:緩存的回收策略:

• LRU ? 最近最少使用的:移除最長時間不被使用的對象。• FIFO ? 先進先出:按對象進入緩存的順序來移除它們。• SOFT ? 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。• WEAK ? 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。• 默認的是 LRU。

flushInterval:緩存刷新間隔

緩存多長時間清空一次,默認不清空,設置一個毫秒值。

readOnly:是否只讀:

true:只讀;mybatis認為所有從緩存中獲取數(shù)據(jù)的操作都是只讀操作,不會修改數(shù)據(jù)。mybatis為了加快獲取速度,直接就會將數(shù)據(jù)在緩存中的引用交給用戶。不安全,速度快。

false:非只讀:mybatis覺得獲取的數(shù)據(jù)可能會被修改。mybatis會利用序列化&反序列的技術克隆一份新的數(shù)據(jù)給你。安全,速度慢

size:緩存存放多少元素;

type='':指定自定義緩存的全類名;實現(xiàn)Cache接口即可;

三、ehcache.xml配置

<?xml version='1.0' encoding='UTF-8'?><ehcache xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='../config/ehcache.xsd'> <!-- 磁盤保存路徑 --> <diskStore path='java.io.tmpdir'/> <defaultCache maxElementsInMemory='1' maxElementsOnDisk='10000000' eternal='false' overflowToDisk='true' timeToIdleSeconds='120' timeToLiveSeconds='120' diskExpiryThreadIntervalSeconds='120' memoryStoreEvictionPolicy='LRU'> </defaultCache></ehcache>

屬性說明:l diskStore:指定數(shù)據(jù)在磁盤中的存儲位置。l defaultCache:當借助CacheManager.add('demoCache')創(chuàng)建Cache時,EhCache便會采用<defalutCache/>指定的的管理策略

以下屬性是必須的:l maxElementsInMemory - 在內(nèi)存中緩存的element的最大數(shù)目l maxElementsOnDisk - 在磁盤上緩存的element的最大數(shù)目,若是0表示無窮大l eternal - 設定緩存的elements是否永遠不過期。如果為true,則緩存的數(shù)據(jù)始終有效,如果為false那么還要根據(jù)timeToIdleSeconds,timeToLiveSeconds判斷l(xiāng) overflowToDisk - 設定當內(nèi)存緩存溢出的時候是否將過期的element緩存到磁盤上

以下屬性是可選的:l timeToIdleSeconds - 當緩存在EhCache中的數(shù)據(jù)前后兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些數(shù)據(jù)便會刪除,默認值是0,也就是可閑置時間無窮大l timeToLiveSeconds - 緩存element的有效生命期,默認是0.,也就是element存活時間無窮大diskSpoolBufferSizeMB 這個參數(shù)設置DiskStore(磁盤緩存)的緩存區(qū)大小.默認是30MB.每個Cache都應該有自己的一個緩沖區(qū).l diskPersistent - 在VM重啟的時候是否啟用磁盤保存EhCache中的數(shù)據(jù),默認是false。l diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運行間隔,默認是120秒。每個120s,相應的線程會進行一次EhCache中數(shù)據(jù)的清理工作l memoryStoreEvictionPolicy - 當內(nèi)存緩存達到最大,有新的element加入的時候, 移除緩存中element的策略。默認是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

相關文章:
主站蜘蛛池模板: 平度市| 关岭| 谷城县| 武冈市| 兴城市| 洱源县| 萨迦县| 滨州市| 聂荣县| 无为县| 绥化市| 柳林县| 石景山区| 民丰县| 遵化市| 浦县| 兴和县| 鸡东县| 宣化县| 黎城县| 乌苏市| 大余县| 凤庆县| 凉城县| 蕉岭县| 广宁县| 海门市| 新疆| 阳西县| 浦东新区| 汽车| 颍上县| 榕江县| 黄大仙区| 扬中市| 保亭| 渭源县| 和田市| 会泽县| 崇左市| 井陉县|