淺談MyBatis緩存

  在談論MyBatis的緩存以前,咱們先說說它的延遲加載,所謂延遲加載, resultMap中的association和collection標籤具備延遲加載的功能。延遲加載的意思是說,在關聯查詢時,利用延遲加載,先加載主信息。使用關聯信息時再去加載關聯信息。java

設置延遲加載sql

        須要在SqlMapConfig.xml文件中,在<settings>標籤中設置下延遲加載。數據庫

        lazyLoadingEnabled、aggressiveLazyLoading緩存

 

什麼是查詢緩存安全

    

Mybatis的一級緩存是指SqlSession。一級緩存的做用域是一個SqlSessionMybatis默認開啓一級緩存app

在同一個SqlSession中,執行相同的查詢SQL,第一次會去查詢數據庫,並寫到緩存中;第二次直接從緩存中取。當執行SQL時兩次查詢中間發生了增刪改操做,則SqlSession的緩存清空。性能

 

Mybatis的二級緩存是指mapper映射文件。二級緩存的做用域是同一個namespace下的mapper映射文件內容,多個SqlSession共享。Mybatis須要手動設置啓動二級緩存spa

在同一個namespace下的mapper文件中,執行相同的查詢SQL,第一次會去查詢數據庫,並寫到緩存中;第二次直接從緩存中取。當執行SQL時兩次查詢中間發生了增刪改操做,則二級緩存清空。.net

一級緩存原理3d

 

一級緩存區域是根據SqlSession爲單位劃分的。

詳細瞭解SqlSession能夠查看:http://blog.csdn.net/hupanfeng/article/details/9238127 這篇博客對於SqlSession的講解比較詳細

每次查詢會先去緩存中找,若是找不到,再去數據庫查詢,而後把結果寫到緩存中。Mybatis的內部緩存使用一個HashMap,keyhashcode+statementId+sql語句。Value爲查詢出來的結果集映射成的java對象。

SqlSession執行insertupdatedelete等操做commit後會清空該SQLSession緩存。

總結下來一級緩存失效的四種狀況
一、不一樣的SqlSession對應不一樣的一級緩存
二、同一個SqlSession可是查詢條件不一樣
三、同一個SqlSession兩次查詢期間執行了任何一次增
刪改操做
四、同一個SqlSession兩次查詢期間手動清空了緩存

二級緩存

二級緩存(second level cache),全局做用域緩存
二級緩存默認不開啓,須要手動配置
MyBatis提供二級緩存的接口以及實現,緩存實現要求
POJO實現Serializable接口
二級緩存在 SqlSession 關閉或提交以後纔會生效
使用步驟
一、全局配置文件中開啓二級緩存
<setting name="cacheEnabled" value="true"/>
二、須要使用二級緩存的映射文件處使用cache配置緩存
<cache />
三、注意:POJO須要實現Serializable接口

 

緩存相關屬性
* eviction=「FIFO」:緩存回收策略:
  • LRU – 最近最少使用的:移除最長時間不被使用的對象。
  • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
  • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
  • 默認的是 LRU。
* flushInterval:刷新間隔,單位毫秒
  • 默認狀況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新
* size:引用數目,正整數
  • 表明緩存最多能夠存儲多少個對象,太大容易致使內存溢出
*readOnly:只讀,true/false
  • true:只讀緩存;會給全部調用者返回緩存對象的相同實例。 所以這些對象
不能被修改。這提供了很重要的性能優點。
  • false:讀寫緩存;會返回緩存對象的拷貝(經過序列化)。這會慢一些,
可是安全,所以默認是 false。
緩存有關設置
一、全局setting的cacheEnable
配置二級緩存的開關。一級緩存一直是打開的。


二、 select標籤的useCache屬性:
配置這個select是否使用二級緩存。一級緩存一直是使用的


三、 sql標籤的flushCache屬性:
增刪改默認flushCache=true。 sql執行之後,會同時清空一級和二級緩存。
查詢默認flushCache=false。


四、 sqlSession.clearCache():
只是用來清除一級緩存。
五、 當在某一個做用域 (一級緩存Session/二級緩存
Namespaces) 進行了 C/U/D 操做後,默認該做用域下
有 select 中的緩存將被clear

上圖是MyBatis的緩存執行過程

相關文章
相關標籤/搜索