MyBatis進修教程(七)-Mybatis緩存引見。本站提示廣大學習愛好者:(MyBatis進修教程(七)-Mybatis緩存引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis進修教程(七)-Mybatis緩存引見正文
1、MyBatis緩存引見
正如年夜多半耐久層框架一樣,MyBatis 異樣供給了一級緩存和二級緩存的支撐
1.一級緩存:
基於PerpetualCache 的 HashMap當地緩存,其存儲感化域為 Session,當 Session flush 或 close 以後,該Session中的一切 Cache 就將清空。
2. 二級緩存:
二級緩存與一級緩存其機制雷同,默許也是采取 PerpetualCache,HashMap存儲,分歧在於其存儲感化域為 Mapper(Namespace),而且可自界說存儲源,如 Ehcache。
3. 關於緩存數據更新機制,當某一個感化域(一級緩存Session/二級緩存Namespaces)的停止了 C/U/D 操作後,默許該感化域下一切 select 中的緩存將被clear。
1.1、Mybatis一級緩存測試
package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; /** * @author gacl * 測試一級緩存 */ public class TestOneLevelCache { /* * 一級緩存: 也就Session級的緩存(默許開啟) */ @Test public void testCache() { SqlSession session = MyBatisUtil.getSqlSession(); String statement = "me.gacl.mapping.userMapper.getUser"; User user = session.selectOne(statement, ); System.out.println(user); /* * 一級緩存默許就會被應用 */ user = session.selectOne(statement, ); System.out.println(user); session.close(); /* . 必需是統一個Session,假如session對象曾經close()過了就弗成能用了 */ session = MyBatisUtil.getSqlSession(); user = session.selectOne(statement, ); System.out.println(user); /* . 查詢前提是一樣的 */ user = session.selectOne(statement, ); System.out.println(user); /* . 沒有履行過session.clearCache()清算緩存 */ //session.clearCache(); user = session.selectOne(statement, ); System.out.println(user); /* . 沒有履行過增刪改的操作(這些操作都邑清算緩存) */ session.update("me.gacl.mapping.userMapper.updateUser", new User(, "user", )); user = session.selectOne(statement, ); System.out.println(user); } }
1.2、Mybatis二級緩存測試
1、開啟二級緩存,在userMapper.xml文件中添加以下設置裝備擺設
<mapper namespace="me.gacl.mapping.userMapper"> <!-- 開啟二級緩存 --> <cache/>
2、測試二級緩存
package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.junit.Test; /** * @author gacl * 測試二級緩存 */ public class TestTwoLevelCache { /* * 測試二級緩存 * 應用兩個分歧的SqlSession對象去履行雷同查詢前提的查詢,第二次查詢時不會再發送SQL語句,而是直接從緩存中掏出數據 */ @Test public void testCache() { String statement = "me.gacl.mapping.userMapper.getUser"; SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory(); //開啟兩個分歧的SqlSession SqlSession session = factory.openSession(); SqlSession session = factory.openSession(); //應用二級緩存時,User類必需完成一個Serializable接口===> User implements Serializable User user = session.selectOne(statement, ); session.commit();//不懂為啥,這個處所必定要提交事務以後二級緩存才會起感化 System.out.println("user="+user); //因為應用的是兩個分歧的SqlSession對象,所以即便查詢前提雷同,一級緩存也不會開啟應用 user = session.selectOne(statement, ); //session.commit(); System.out.println("user="+user); } }
1.3、二級緩存彌補解釋
1. 映照語句文件中的一切select語句將會被緩存。
2. 映照語句文件中的一切insert,update和delete語句會刷新緩存。
3. 緩存會應用Least Recently Used(LRU,比來起碼應用的)算法來發出。
4. 緩存會依據指定的時光距離來刷新。
5. 緩存會存儲1024個對象
cache標簽經常使用屬性:
<cache eviction="FIFO" <!--收受接管戰略為先輩先出--> flushInterval="60000" <!--主動刷新時光60s--> size="512" <!--最多緩存512個援用對象--> readOnly="true"/> <!--只讀-->
給年夜家彌補點常識:
和hibernate一樣,mybatis也有緩存機制
一級緩存是基於 PerpetualCache(mybatis自帶)的 HashMap 當地緩存,感化規模為session,所以當session commit或close後,緩存就會被清空
二級緩存默許也是基於 PerpetualCache,然則可認為其制訂存儲源,好比ehcache
一級緩存緩存的是SQL語句,而二級緩存緩存的是成果對象,看以下例子(mybatis的日記級別設為debug)