在談論MyBatis的緩存以前,咱們先說說它的延遲加載,所謂延遲加載, resultMap中的association和collection標籤具備延遲加載的功能。延遲加載的意思是說,在關聯查詢時,利用延遲加載,先加載主信息。使用關聯信息時再去加載關聯信息。java
設置延遲加載sql
須要在SqlMapConfig.xml文件中,在<settings>標籤中設置下延遲加載。數據庫
lazyLoadingEnabled、aggressiveLazyLoading緩存
什麼是查詢緩存安全
Mybatis的一級緩存是指SqlSession。一級緩存的做用域是一個SqlSession。Mybatis默認開啓一級緩存。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,key爲hashcode+statementId+sql語句。Value爲查詢出來的結果集映射成的java對象。
SqlSession執行insert、update、delete等操做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的緩存執行過程