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