1.MyBatis快取
MyBatis 包含一個非常強大的查詢快取特性,它可以非常方便地配置和定制.快取可以極大的提升查詢效率.

1).一級快取
public Employee getEmpById(Integer id);
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee" databaseId="mysql" >
select * from tbl_employee where id = #{id}
</select>
@Test
public void testFirstLevelCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(10);
System.out.println(emp01);
//
Employee emp02 = mapper.getEmpById(1-0);
System.out.println(emp02);
System.out.println(emp01==emp02);
}finally {
openSession.close();
}
}
2).一級快取失效情況
(1).sqlSession不同
(2).sqlSession相同,查詢條件不同(當前一級快取中還沒有這個資料)
(3).sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前資料有影響)
(4).sqlSession相同,手動清除了一級快取
public Employee getEmpById(Integer id);
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee" databaseId="mysql" >
select * from tbl_employee where id = #{id}
</select>
@Test
public void testFirstLevelCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(10);
System.out.println(emp01);
//1、Sqlsession不同
// SqlSession openSession2 = sqlSessionFactory.openSession();
// EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
// Employee emp02 = mapper2.getEmpById(10);
//2、sqlSession相同,查詢條件不同
// Employee emp02 = mapper.getEmpById(3);
// System.out.println(emp02);
// System.out.println(emp01==emp02);
//3、sqlSession相同,兩次查詢之間執行了增刪改操作
// mapper.addEmp(new Employee(null, "testCache", "[email protected]", "1"));
// System.out.println("資料添加成功");
// Employee emp02 = mapper.getEmpById(10);
// System.out.println(emp02);
// System.out.println(emp01==emp02);
//4、sqlSession相同,手動清除了一級快取
openSession.clearCache();
Employee emp02 = mapper.getEmpById(10);
System.out.println(emp02);
System.out.println(emp01==emp02);
}finally {
openSession.close();
}
}
3).二級快取
二級快取(second level cache),全域作用域快取.
二級快取默認不開啟,需要手動配置.
MyBatis提供二級快取的介面以及實作,快取實作要求POJO實作Serializable介面.
二級快取在 SqlSession 關倍訓提交之后才會生效.
(1).二級快取使用
二級快取使用:
①.開啟全域二級快取配置:<setting name="cacheEnabled" value="https://www.cnblogs.com/CSAH/p/true"/>
②.去需要使用二級快取的xml中配置使用二級快取;添加<cache></cache>
③.POJO需要實作序列化介面
<setting name="cacheEnabled" value="https://www.cnblogs.com/CSAH/p/true"/>
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper"> <!-- cache:使用二級快取的namespace --> <!-- eviction:快取的清除策略;LRU|FIFO|SOFT|WEAK --> <!-- LRU – 最近最少使用的:移除最長時間不被使用的物件, --> <!-- FIFO – 先進先出:按物件進入快取的順序來移除它們, --> <!-- SOFT – 軟參考:基于垃圾回收器狀態和軟參考規則移除物件, --> <!-- WEAK – 弱參考:更積極地基于垃圾收集器狀態和弱參考規則移除物件, --> <!-- flushInterval(重繪間隔):快取多長時間清空一次,默認不清空,可以設定一個毫秒值啟用重繪間隔 --> <!-- readOnly(只讀):屬性可以被設定為 true 或 false --> <!-- true:只讀;mybatis認為所有從快取中獲取資料的操作都是只讀操作,不會修改資料; --> <!-- 只讀的快取會給所有呼叫者回傳快取物件的相同實體, 因此這些物件不能被修改, 提供了可觀的性能提升--> <!-- false:非只讀;mybatis覺得獲取的資料可能會被修改; --> <!-- 可讀寫的快取會(通過序列化)回傳快取物件的拷貝, 速度上會慢一些,但是更安全,因此默認值是 false --> <!-- size(參考數目):屬性可以被設定為任意正整數,要注意欲快取物件的大小和運行環境中可用的記憶體資源.默認值是 1024 --> <!-- type:屬性指定的類必須實作 org.apache.ibatis.cache.Cache 介面.且提供一個接受 String 引數作為 id 的構造器 --> <!-- 指定自定義快取的全類名,實作Cache介面即可 --> <!-- <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> --> <cache></cache> </mapper>
@Test
public void testSecondLevelCache() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
SqlSession openSession2 = sqlSessionFactory.openSession();
try {
//1、
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
Employee emp01 = mapper.getEmpById(1);
System.out.println(emp01);
openSession.close();
//第二次查詢是從二級快取中拿到的資料,并沒有發送新的sql
//mapper2.addEmp(new Employee(null, "aaa", "nnn", "0"));
Employee emp02 = mapper2.getEmpById(1);
System.out.println(emp02);
openSession2.close();
}finally {
}
}
(2).二級快取作業原理
二級快取作業原理:
①.一個會話,查詢一條數,這個資料就會被放在當前會話的一級快取中;
②.如果會話關閉;一級快取中的資料會被保存到二級快取中;新的會話查詢資訊,就可以參照二級快取中的內容;
③.不同namespace查出的資料會放在自己對應的快取中(map):sqlSession===EmployeeMapper==>Employee|DepartmentMapper===>Department
④.二級快取作業效果:查出的資料都會被默認先放在一級快取中.只有會話提交或者關閉以后,一級快取中的資料才會轉移到二級快取中;
(3).二級快取屬性設定
①.cacheEnabled="true|false": false關閉快取(二級快取關閉)(一級快取一直可用的)
②.每個select標簽都有useCache="true|false": false不使用快取(一級快取依然使用,二級快取不使用)
③.*每個增刪改標簽的:flushCache="true|false":(一級二級都會清除)增刪改執行完成后就會清楚快取;
測驗:flushCache="true":一級快取會被清空;二級也會被清空;每次查詢之后都會清空快取,快取是沒有被使用的;
④.sqlSession.clearCache();只是清除當前session的一級快取
⑤.localCacheScope:本地快取作用域;一級快取SESSION;當前會話的所有資料保存在會話快取中;STATEMENT:可以禁用一級快取;
|
/** * MyBatis系統中默認定義了兩級快取:一級快取和二級快取 * 一級快取(本地快取):sqlSession級別的快取;一級快取是一直開啟的;SqlSession級別的一個Map * 與資料庫同一次會話期間查詢到的資料會放在本地快取中; * 以后如果需要獲取相同的資料,直接從快取中拿,沒必要再去查詢資料庫; * 一級快取失效情況:沒有使用到一級快取的情況,效果就是兩次查詢都需要向資料庫發出查詢 * 1、sqlSession不同 * 2、sqlSession相同,查詢條件不同(當前一級快取中還沒有這個資料) * 3、sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前資料有影響) * 4、sqlSession相同,手動清除了一級快取 * * 二級快取(全域快取):基于namespace級別的快取;一個namespace對應一個二級快取; * 二級快取作業原理: * 1、一個會話,查詢一條數,這個資料就會被放在當前會話的一級快取中; * 2、如果會話關閉;一級快取中的資料會被保存到二級快取中;新的會話查詢資訊,就可以參照二級快取中的內容; * 3、不同namespace查出的資料會放在自己對應的快取中(map):sqlSession===EmployeeMapper==>Employee|DepartmentMapper===>Department * 二級快取作業效果:查出的資料都會被默認先放在一級快取中.只有會話提交或者關閉以后,一級快取中的資料才會轉移到二級快取中; * 二級快取使用: * 1、開啟全域二級快取配置:<setting name="cacheEnabled" value="https://www.cnblogs.com/CSAH/p/true"/> * 2、去需要使用二級快取的xml中配置使用二級快取;添加<cache></cache> * 3、POJO需要實作序列化介面 * * 快取有關屬性/設定: * 1、cacheEnabled="true|false": false關閉快取(二級快取關閉)(一級快取一直可用的) * 2、每個select標簽都有useCache="true|false": false不使用快取(一級快取依然使用,二級快取不使用) * 3、*每個增刪改標簽的:flushCache="true|false":(一級二級都會清除)增刪改執行完成后就會清楚快取; * 測驗:flushCache="true":一級快取會被清空;二級也會被清空;每次查詢之后都會清空快取,快取是沒有被使用的; * 4、sqlSession.clearCache();只是清除當前session的一級快取 * 5、localCacheScope:本地快取作用域;一級快取SESSION;當前會話的所有資料保存在會話快取中;STATEMENT:可以禁用一級快取; * @throws IOException */ |
2.第三方快取整合
EhCache 是一個純Java的行程內快取框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider.
MyBatis定義了Cache介面方便我們進行自定義擴展.
參考檔案:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache
http://mybatis.org/ehcache-cache/index.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158887.html
標籤:Java
下一篇:Python 常用筆記
