Mybatis緩存+配置


 

mybatis提供了緩存機制減輕數據庫壓力,提高數據庫性能

mybatis的緩存分為兩級:一級緩存、二級緩存

一級緩存是SqlSession級別的緩存,緩存的數據只在SqlSession內有效

二級緩存是mapper級別的緩存,同一個namespace公用這一個緩存,所以對SqlSession是共享的

 

Mybatis的一級緩存和二級緩存執行順序

1、先判斷二級緩存是否開啟,如果沒開啟,再判斷一級緩存是否開啟,如果沒開啟,直接查數據庫

2、如果一級緩存關閉,即使二級緩存開啟也沒有數據,因為二級緩存的數據從一級緩存獲取

3、一般不會關閉一級緩存

4、二級緩存默認不開啟

5、如果二級緩存關閉,直接判斷一級緩存是否有數據,如果沒有就查數據庫

6、如果二級緩存開啟,先判斷二級緩存有沒有數據,如果有就直接返回;如果沒有,就查詢一級緩存,如果有就返回,沒有就查詢數據庫;

 

 

一級緩存:

  mybatis的一級緩存是SqlSession級別的緩存,在操作數據庫的時候需要先創建SqlSession會話對象,在對象中有一個HashMap用於存儲緩存數據,此HashMap是當前會話對象私有的,別的SqlSession會話對象無法訪問。

  

 

  具體流程:

      1.第一次執行select完畢會將查到的數據寫入SqlSession內的HashMap中緩存起來

      2.第二次執行select會從緩存中查數據,如果select相同切傳參數一樣,那么就能從緩存中返回數據,不用去數據庫了,從而提高了效率

    

  注意事項:

      1.如果SqlSession執行了DML操作(insert、update、delete),並commit了,那么mybatis就會清空當前SqlSession緩存中的所有緩存數據,這樣可以保證緩存中的存的數據永遠和數據庫中一致,避免出現臟讀

      2.當一個SqlSession結束后那么他里面的一級緩存也就不存在了,mybatis默認是開啟一級緩存,不需要配置

      3.mybatis的緩存是基於[namespace:sql語句:參數]來進行緩存的,意思就是,SqlSession的HashMap存儲緩存數據時,是使用[namespace:sql:參數]作為key,查詢返回的語句作為value保存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19

 

二級緩存:

  二級緩存是mapper級別的緩存,也就是同一個namespace的mappe.xml,當多個SqlSession使用同一個Mapper操作數據庫的時候,得到的數據會緩存在同一個二級緩存區域

  二級緩存默認是沒有開啟的。需要在setting全局參數中配置開啟二級緩存

  conf.xml:

<settings>
        <setting name="cacheEnabled" value="true"/>默認是false:關閉二級緩存
<settings>

  在userMapper.xml中配置:

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>當前mapper下所有語句開啟二級緩存

  這里配置了一個LRU緩存,並每隔60秒刷新,最大存儲512個對象,而卻返回的對象是只讀的

  若想禁用當前select語句的二級緩存,添加useCache="false"修改如下:

<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

  具體流程:

      1.當一個sqlseesion執行了一次select后,在關閉此session的時候,會將查詢結果緩存到二級緩存

      2.當另一個sqlsession執行select時,首先會在他自己的一級緩存中找,如果沒找到,就回去二級緩存中找,找到了就返回,就不用去數據庫了,從而減少了數據庫壓力提高了性能 

      上面糾正為: 先查二級緩存,再查一級緩存,再查數據庫;即使在一個sqlSession中,也會先查二級緩存;一個namespace中的查詢更是如此;

                 所以說,緩存執行順序是:二級緩存-->一級緩存-->數據庫

  注意事項:

      1.如果SqlSession執行了DML操作(insert、update、delete),並commit了,那么mybatis就會清空當前mapper緩存中的所有緩存數據,這樣可以保證緩存中的存的數據永遠和數據庫中一致,避免出現臟讀

      2.mybatis的緩存是基於[namespace:sql語句:參數]來進行緩存的,意思就是,SqlSession的HashMap存儲緩存數據時,是使用[namespace:sql:參數]作為key,查詢返回的語句作為value保存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19

 

 

原文:https://www.cnblogs.com/winclpt/articles/7511672.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM