Mybaits總結--二級快取
Mybaits中有一級快取和二級快取,在預設情況一級快取時開啟的,二級快取時關閉的
1.一級快取:session級別:查詢的相同的資訊將會從session中先查詢
A:一級快取預設就會被使用
B:必須是同一個Session,如果session物件已經close()過了就不可能用了
C:查詢條件是一樣的
D:沒有執行過session.clearCache()清理快取
E:沒有執行過增刪改的操作(這些操作都會清理快取)
2.二級快取:二級快取與一級快取其機制相同,預設也是採用 PerpetualCache,HashMap儲存,不同在於其儲存作用域為 Mapper(Namespace),並且可自定義儲存源,如 Ehcache。
A:作用:二級快取範圍更大了一些,可以被多個SqlSession所共用。
一、使用
1、新增一個<cache>在userMapper.xml中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="zhuojing.mybaits.ache.cuserMapper1"> <!-- 根據id查詢得到一個user物件 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> <select id="getCUser" resultType="CUser" parameterType="int"> select * from c_user where id = #{id} </select> <update id="updateCUser" parameterType="CUser"> update c_user set name = #{name}, age = #{age} where id = #{id} </update> </mapper>
注: a:對映語句檔案中的所有select語句將會被快取。
b:對映語句檔案中的所有insert,update和delete語句會重新整理快取。
c:快取會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。
d:快取會根據指定的時間間隔來重新整理。
e:快取會儲存1024個物件
cache標籤說明
eviction="FIFO" //回收策略為先進先出
flushInterval="60000" //自動重新整理時間60s
size="512" //最多快取512個引用物件
readOnly="true"/> //只讀
2、實體必須實現Serilizable介面,因為這些快取資料可能會反序列化寫到硬碟或者其他地方。
public class CUser implements Serializable{
private Integer id;
private String name;
private int age;
}
3、測試類
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import zhuojing.mybaits.util.MybaitsUtils;
public class AcheTest {
/**
* 一級快取:下次查詢的相同的資訊將會從session中先查詢
*/
@Test
public void test1(){
SqlSessionFactory factory = MybaitsUtils.getFactory();
SqlSession session = factory.openSession();
//執行了更新操作,將不會執行Session
String statement = "zhuojing.mybaits.ache.cuserMapper1.getCUser";
CUser cUser = session.selectOne(statement, 1);
System.out.println(cUser);
//session.close();
//清空Session 快取
//session.clearCache();
String statement1 = "zhuojing.mybaits.ache.cuserMapper1.updateCUser";
CUser cUser2 = new CUser(1, "Tom1", 18);
session.update(statement1, cUser2);
cUser = session.selectOne(statement, 1);
System.out.println(cUser);
}
@Test
public void test2(){
SqlSessionFactory factory = MybaitsUtils.getFactory();
String statement = "zhuojing.mybaits.ache.cuserMapper1.getCUser";
SqlSession session = factory.openSession(true);
CUser user = session.selectOne(statement, 1);
session.commit();
System.out.println("user="+user);
SqlSession session2 =factory.openSession(true);
user = session2.selectOne(statement, 1);
session.commit();
System.out.println("user2="+user);
}
}