程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MyBatis進修教程(七)-Mybatis緩存引見

MyBatis進修教程(七)-Mybatis緩存引見

編輯:關於JAVA

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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved