MyBatis學習總結(八)---緩存機制

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

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

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

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

一級緩存:

  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時,首先會在他自己的一級緩存中找,如果沒找到,就回去二級緩存中找,找到了就返回,就不用去數據庫了,從而減少了數據庫壓力提高了性能 

  注意事項:

      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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章