1. 程式人生 > >Mybatis快取解析

Mybatis快取解析

快取是將資料儲存到記憶體中,在讀取的時候無需從磁碟讀入,具備快速讀取和使用的優點,快取的關鍵在於快取的命中率,命中率高就能極大提升系統性能,命中率低則不存在使用的意義。

預設開啟一級快取

一級快取是在SqlSession層面上的,多個SqlSession之間不共享,SqlSession呼叫Mapper介面執行Sql語句查詢時,會進行快取,當第二次用相同的SqlSession呼叫相同的Mapper介面執行相同的Sql查詢語句時,會從快取中獲取,而不傳送Sql到資料庫。當然,讀取快取的前提是快取沒有過期,而且快取沒有被重新整理

二級快取要手動開啟,方式為XML檔案配置<cache/>,二級快取存在的原因是多個SqlSession之間是隔離的,一級快取不能共享,二級快取就是為了實現SqlSession之間可以共享快取,二級快取即在SqlSessionFactory層面上的。其次,二次快取要求返回的POJO是可以序列化的,要實現Serializable介面。 當使用二級快取的時候,sqlSession呼叫commit方法後才會生效。

<cache/>配置中包含了很多預設配置。單獨<cache/>配置,意味著:

  • 對映語句檔案的所有的select語句都會被快取
  • 對映語句檔案中所有的insert、update、delete語句都會重新整理快取
  • 快取會使用預設的LRU演算法來淘汰部分快取
  • 根據時間表,例如No Flush Interval,(CNFI,沒有重新整理間隔),快取不會以任何時間順序來重新整理
  • 快取會儲存列表集合或物件(無論查詢方法返回什麼)的1024個引用
  • 快取會被視為read/write(可讀可寫)的快取,意味著物件檢索不是共享的,而且可以安全地被呼叫者修改,不干擾其他呼叫者或者執行緒所做的潛在修改

<cache/>配置的修改 <cache eviction="LRU" readOnly="true" size="512" flushInterval="60000"/> eviction:代表快取回收策略,支援LRU,FIFO,SOFT,WEAK flushInterval:重新整理快取間隔時間,單位為毫秒,如果不配置,則當SQL執行的時候才會重新整理快取

自定義快取,一級和二級快取都是系統快取,系統快取是mybatis快取在本地機器。定製快取可以使用各類不同的快取伺服器,實現org.apache.ibatis.cache介面即可。

還可以在SQL語句層面上配置快取規則,來決定sql語句是否使用快取和重新整理快取,兩個重要屬性:useCache和flushCache,在mapper配置檔案中的sql語句元素中配置 <select id="" flushCache="false" useCache="true"/> <delete id="" flushCache="true"/>

查詢語句才會使用快取,其他語句不會,但是可以重新整理快取