Mybatis-----緩存篇

MyBatis將數據緩存設計成兩級結構,分爲一級緩存、二級緩存:java

一級緩存

  1. 基礎概念
  • mybatis的一級緩存是sqlsession級別的緩存,sqlsession只能訪問本身的一級緩存的數據,mybatis默認是支持一級緩存的,不須要任何配置便可使用,通常也不能夠配置,如需定製一級緩存能夠去定製本身的插件。
  • 同一個sqlsession再次發出相同的sql,就從緩存中取不走數據庫。若是兩次中間出現commit操做(修改、添加、刪除),本sqlsession中的一級緩存區域所有清空,下次再去緩存中查詢不到因此要從數據庫查詢,從數據庫查詢到再寫入緩存。
  • mybatis和spring整合後進行mapper代理開發,不支持一級緩存,mybatis和spring整合,spring按照mapper的模板去生成mapper代理對象,模板中在最後統一關閉sqlsession。

二級緩存

  1. 基礎概念
  • mybatis的二級緩存是mapper級別的緩存(mapper同一個命名空間的),mapper以命名空間爲單位建立緩存數據結構,結構是map<key、value>。
  • 緩存順序:查詢每次mybatis進行查詢的時候,先看是否開啓了二級緩存,若是開啓就從二級緩存的數據結構中取緩存數據,若是緩存中沒有,再從一級緩存中取,若是一級緩存沒有,再從數據庫中查詢。
  1. 配置方式

第一步:在mybatis的全局配置文件中配置: spring

<settings>
		<!-- 開啓二級緩存 -->
		<setting name="cacheEnabled" value="true"/>
	</settings>
複製代碼

第二步:在要使用二級緩存的mapper中添加配置: sql

<cache/>
複製代碼

第三步:將mapper對應的java實體進行序列化(實現 java.io.serializable接口,若是不實現則拋出異常:Cause: java.io.NotSerializableException),二級緩存能夠將內存的數據寫到磁盤,存在對象的序列化和反序列化,因此要實現java.io.serializable接口。 若是結果映射的pojo中還包括了pojo,都要實現java.io.serializable接口。(常常忘記這步驟,請注意數據庫

  1. 如何禁用二級緩存(對於變化頻率高的sql語句須要禁用二級緩存)
  • 在statement中設置useCache=false能夠禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認狀況是true,即該sql使用二級緩存。
  • 配置方式:
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
複製代碼
  1. 禁止刷新緩存: 咱們在特定的狀況下,還能夠單獨配置刷新緩存【但不建議使用】flushCache,默認是的true,設置後不會自動刷新緩存。
  • 配置方式:
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User" flushCache="false"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} 
</update>
複製代碼
  1. 二級緩存默認的回收策略是LRU(移除最長時間不被使用的對象)
  • LRU – 最近最少使用的:移除最長時間不被使用的對象。
  • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
  • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。

配置方式:緩存

<cache  
//緩存回收策略
eviction="FIFO"  
//緩存刷新間隔
flushInterval="60000"  
size="512"  
readOnly="true"/>
複製代碼
相關文章
相關標籤/搜索