1. 程式人生 > >MyBatis學習總結——Mybatis快取

MyBatis學習總結——Mybatis快取

MyBatis學習總結——Mybatis快取
一、MyBatis快取介紹
  正如大多數持久層框架一樣,MyBatis 同樣提供了一級快取和二級快取的支援

一級快取: 基於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一級快取測試
複製程式碼
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.junit.Test;
7
8 /**
9 * @author gacl
10 * 測試一級快取
11 /
12 public class TestOneLevelCache {
13
14 /

15 * 一級快取: 也就Session級的快取(預設開啟)
16 /
17 @Test
18 public void testCache1() {
19 SqlSession session = MyBatisUtil.getSqlSession();
20 String statement = “me.gacl.mapping.userMapper.getUser”;
21 User user = session.selectOne(statement, 1);
22 System.out.println(user);
23
24 /


25 * 一級快取預設就會被使用
26 /
27 user = session.selectOne(statement, 1);
28 System.out.println(user);
29 session.close();
30 /

31 1. 必須是同一個Session,如果session物件已經close()過了就不可能用了
32 /
33 session = MyBatisUtil.getSqlSession();
34 user = session.selectOne(statement, 1);
35 System.out.println(user);
36
37 /

38 2. 查詢條件是一樣的
39 /
40 user = session.selectOne(statement, 2);
41 System.out.println(user);
42
43 /

44 3. 沒有執行過session.clearCache()清理快取
45 /
46 //session.clearCache();
47 user = session.selectOne(statement, 2);
48 System.out.println(user);
49
50 /

51 4. 沒有執行過增刪改的操作(這些操作都會清理快取)
52 */
53 session.update(“me.gacl.mapping.userMapper.updateUser”,
54 new User(2, “user”, 23));
55 user = session.selectOne(statement, 2);
56 System.out.println(user);
57
58 }
59 }
複製程式碼
1.2、Mybatis二級快取測試
  1、開啟二級快取,在userMapper.xml檔案中新增如下配置

  2、測試二級快取

複製程式碼
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.junit.Test;
8
9 /**
10 * @author gacl
11 * 測試二級快取
12 /
13 public class TestTwoLevelCache {
14
15 /

16 * 測試二級快取
17 * 使用兩個不同的SqlSession物件去執行相同查詢條件的查詢,第二次查詢時不會再發送SQL語句,而是直接從快取中取出資料
18 */
19 @Test
20 public void testCache2() {
21 String statement = “me.gacl.mapping.userMapper.getUser”;
22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
23 //開啟兩個不同的SqlSession
24 SqlSession session1 = factory.openSession();
25 SqlSession session2 = factory.openSession();
26 //使用二級快取時,User類必須實現一個Serializable介面===> User implements Serializable
27 User user = session1.selectOne(statement, 1);
28 session1.commit();//不懂為啥,這個地方一定要提交事務之後二級快取才會起作用
29 System.out.println(“user=”+user);
30
31 //由於使用的是兩個不同的SqlSession物件,所以即使查詢條件相同,一級快取也不會開啟使用
32 user = session2.selectOne(statement, 1);
33 //session2.commit();
34 System.out.println(“user2=”+user);
35 }
36 }
複製程式碼
1.3、二級快取補充說明
  1. 對映語句檔案中的所有select語句將會被快取。

2. 對映語句檔案中的所有insert,update和delete語句會重新整理快取。

3. 快取會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。

4. 快取會根據指定的時間間隔來重新整理。

5. 快取會儲存1024個物件

cache標籤常用屬性:

<cache
eviction=“FIFO”
flushInterval=“60000”
size=“512”
readOnly=“true”/>
轉載於部落格園,博主孤傲蒼狼。