mybatis一級緩存的實現及其問題

一級緩存的特性是:

1,一級緩存模式是開啓狀態(可通過localCacheScope屬性控制,默認爲SESSION,開啓)
2,一級緩存作用域在於SqlSession(大家可以關閉SqlSession,然後創建一個新的,再獲取對象,觀察實驗結果),緩存隨着會話(SqlSession)的創建而產生,隨着會話結束而釋放(使用spring託管的mybatis後,session是會自動關閉的,參見https://www.cnblogs.com/zhjh256/p/12434447.html,在非spring託管時是需要人工關閉的,否則會導致連接泄漏)。對一次會話的查詢操作,總是先查看緩存中是否存在查詢結果,如果存在則直接取緩存中的結果,不存在則查詢數據庫。這樣的話,一次會話中的完全相同的查詢則只會查詢一次,節省了系統資源。
3,如果中間有對數據的更新操作,則將清空一級緩存。

如下:

 

 

 

 

 

 一級緩存的最大缺點在於只能用於只有一個會話的應用,如果是分佈式應用或併發應用,如果在sqlsession期間,其他節點、連接更新了數據庫或數據庫中直接進行了更新,取到的是緩存的舊信息,對於人工管理的sqlsession更是如此,會導致邏輯錯誤。因此,最好的方法是禁用一級緩存,啓用二級緩存。

 

二級緩存通過<setting name="cacheEnabled" value="true"/>控制,也支持mapper級別配置。

默認的二級緩存配置會有如下特點:
2.1 所有的Select語句將會被緩存
2.2 所有的更新語句(insert、update、delete)將會刷新緩存
2.3 緩存將採用LRU(Least Recently Used 最近最少使用)算法來回收
2.4 緩存會存儲1024個對象的引用
回收算法建議採用LRU,當然,還提供了FIFO(先進先出),SOFT(軟引用),WEAK(弱引用)等其他算法。

 

 

 

二級緩存關鍵說明:

當關閉了SqlSession之後,纔會將查詢數據保存到二級緩存中(SqlSessionFactory)中,所以纔有了上述的緩存命中率。MyBatis的二級緩存默認採用的是Map的實現。

對原理的解析可以參見https://blog.csdn.net/luanlouis/article/details/41280959。

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