1. 程式人生 > >MyBatis系統快取和自定義快取

MyBatis系統快取和自定義快取

1、 系統快取(一級快取)
Mybatis對快取提供支援,在沒有開啟快取的情況下,mybatis會預設開啟一級快取(一級快取只是相對於同一個SQLSession而言)
所以在引數和SQL完全一樣的情況下,我們使用同一個SQLSession物件呼叫同一個Mapper的方法,往往只執行一次SQL,因為SQLSession在第一次查詢之後,mybatis會將其放入快取,後續再次查詢時,在快取沒有超時的情況下,SQLSession會取出當前的快取,不再把SQL發往資料庫。如果在這裡使用的是不同的SQLSession,即便是同樣的引數和SQL,也不會使用快取。
2、 系統快取(二級快取)
由於一級快取屬於SQLSession層面的,每個SQLSession又是隔離的,為了能共享快取物件,就需要配置二級快取,使得快取在SQLSessionFactory層面上能提供給各個SQLSession物件共享。在預設情況下,二級快取是不開啟的,開啟二級快取需要進行配置,實現二級快取的時候,mybatis要求返回POJO必須是可序列化的,也就是要求實現serializable介面(否則會拋異常 ),開啟二級快取的配置很簡單,只需要在XML檔案配置開啟就好了
例如:
如果只是這樣配置的話,很多配置都會採用預設值:
a)對映檔案的所有的select語句會被快取
b)對映語句中的所有insert、update、delete語句會重新整理快取
c)快取會使用預設的Least Recently Used(LRU)演算法來回收
d)根據時間表,比如沒有No Flush Interval(CNFI,沒有重新整理間隔),快取不會以任何時間順序來重新整理
e)快取會儲存列表或物件(無論查詢方法返回什麼)的1024個引用
f)快取會被視為read/write的快取,意味著物件檢索是不共享的,而且可以安全的被呼叫者修改,不干擾其他呼叫者或者執行緒所在的潛在修改
對於二級快取的配置我們是可以修改的,例如

解釋:
eviction:代表是快取回收策略,目前mybatis提供以下策略:
a) LUR:最近最少使用的,移除最長時間不用的物件
b) FIFO:先進先出,按照物件進入快取的順序來移除他們
c) SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的物件
d) WEAK:弱引用,更積極地移除基於垃圾回收器狀態和弱引用規則的物件
flushInterval:重新整理間隔時間,單位為毫秒,如果不配置,當SQL被執行的時候才會去重新整理
size:引用數目,一個正整數,帶便快取可以快取多少個物件,不宜設定太大,過大會導致記憶體溢位
readOnly:只讀,預設為false,設定為只讀後我們只能訪問快取而不能修改
3、 自定義快取
系統快取是mybatis在應用伺服器上的本地快取,在大型伺服器上,會採用快取伺服器,這時我們可以採用redis等快取。採用自定義快取需要實現mybatis的介面:org.apache.ibatis.cache.Cache,快取介面需要自己實現,假如我們已經存在一個實現類:com.cache.test.CacheTest,我們的配置如下:

注:以上內容根據《深入淺出mybatis技術原理與實戰》一書整理編寫,感謝作者的辛勤勞作。