欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年08月27日 15:55:55   作者:IT-執(zhí)念  
這篇文章主要介紹了MyBatis緩存實(shí)現(xiàn)原理及代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

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

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

  1、sqlSession不同

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

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

  4、sqlSession相同,手動(dòng)清除了一級(jí)緩存。

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

  基本namespace級(jí)別的緩存:一個(gè)namespace對(duì)應(yīng)一個(gè)二級(jí)緩存:

  工作機(jī)制:

  1、一個(gè)會(huì)話,查詢一條數(shù)據(jù),這個(gè)數(shù)據(jù)就會(huì)被放在當(dāng)前會(huì)話的一級(jí)緩存中:

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

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

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

  4、如何開啟二級(jí)緩存:

   ?、匍_啟全局二級(jí)緩存配置:    

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

   ?、谌apper.xml中配置使用二級(jí)緩存:

<cache></cache>

    ③對(duì)應(yīng)的POJO實(shí)現(xiàn)序列化接口

  5、和緩存有關(guān)的設(shè)置屬性

    ①cacheEnabled=true:false:關(guān)閉緩存(二級(jí)緩存關(guān)閉)(一級(jí)緩存一直可用的)

   ?、诿總€(gè)select標(biāo)簽都有useCache="true":false:不使用緩存(一級(jí)緩存依然使用,二級(jí)緩存不使用)

   ?、?每個(gè)增刪改標(biāo)簽的:flushCache="true":(一級(jí)二級(jí)都會(huì)清除)

    ④sqlSession.clearCache();只是清楚當(dāng)前session的一級(jí)緩存;

    ⑤全局配置localCacheScope:

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

      STATEMENT:可以禁用一級(jí)緩存。

  6、第三方緩存整合

   ?、賹?dǎo)入第三方緩存包即可;

   ?、趯?dǎo)入與第三方緩存整合的適配包;官方有;

   ?、踡apper.xml中使用自定義緩存

    使用Ehcache緩存框架

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

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

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

  eviction:緩存的回收策略:

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

  flushInterval:緩存刷新間隔

    緩存多長時(shí)間清空一次,默認(rèn)不清空,設(shè)置一個(gè)毫秒值。

  readOnly:是否只讀:

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

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

  size:緩存存放多少元素;

  type="":指定自定義緩存的全類名;實(shí)現(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ù)在磁盤中的存儲(chǔ)位置。
l defaultCache:當(dāng)借助CacheManager.add("demoCache")創(chuàng)建Cache時(shí),EhCache便會(huì)采用<defalutCache/>指定的的管理策略

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

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺拷貝和深拷貝原理分析

    淺拷貝和深拷貝原理分析

    Java 對(duì)象拷貝是為對(duì)象賦值的一種方式,簡單來說就是創(chuàng)建一個(gè)和原對(duì)象相同的對(duì)象,新創(chuàng)建的對(duì)象是原對(duì)象的一個(gè)副本。面試官賊拉喜歡在面試的時(shí)候問一問你淺拷貝和深拷貝的原理
    2021-08-08
  • java map中相同的key保存多個(gè)value值方式

    java map中相同的key保存多個(gè)value值方式

    這篇文章主要介紹了java map中相同的key保存多個(gè)value值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java 基礎(chǔ)之修飾符關(guān)鍵詞整理

    Java 基礎(chǔ)之修飾符關(guān)鍵詞整理

    這篇文章主要介紹了Java 基礎(chǔ)之修飾符關(guān)鍵詞整理的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解

    對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解

    這篇文章主要介紹了對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類的理解,需要的朋友可以參考下
    2016-01-01
  • Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問題)

    Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問題)

    這篇文章主要介紹了Filter中獲取傳遞參數(shù)方式(解決post請(qǐng)求參數(shù)問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java代碼中4種字符串拼接方式分析

    Java代碼中4種字符串拼接方式分析

    本文主要介紹了Java代碼中4種字符串拼接方式分析,主要介紹了“+”號(hào)、StringBuilder、StringJoiner、String#join,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • IDEA Maven依賴下載總是失敗的幾種解決方法

    IDEA Maven依賴下載總是失敗的幾種解決方法

    我們本地使用 IDEA 運(yùn)行 maven 項(xiàng)目的時(shí)候,有時(shí)候運(yùn)氣不好,就會(huì)遇到某些 maven 依賴無法正常找到、導(dǎo)入,這就會(huì)導(dǎo)致 IDEA 構(gòu)建項(xiàng)目的時(shí)候爆出一堆醒目的紅色 Error,今天給大家分享IDEA Maven依賴下載總是失敗的幾種解決方法,感興趣的朋友一起看看吧
    2023-09-09
  • 關(guān)于Mybatis-Plus?Update更新策略問題

    關(guān)于Mybatis-Plus?Update更新策略問題

    這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java Hibernate延遲加載

    java Hibernate延遲加載

    對(duì)one-to-one 關(guān)系進(jìn)行延遲加載和其他關(guān)系相比稍微有些不同。many-to-one 的延遲加載是在配置文件的class 標(biāo)簽
    2008-10-10
  • Java實(shí)現(xiàn)定時(shí)器的4種方法超全總結(jié)

    Java實(shí)現(xiàn)定時(shí)器的4種方法超全總結(jié)

    對(duì)于一些特殊的代碼是需要定時(shí)執(zhí)行的,下面來看看定時(shí)器該如何編寫吧,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)定時(shí)器的4種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05

最新評(píng)論