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)