1. 程式人生 > >Mybaits總結--二級快取

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);
		
	}
}