1. 程式人生 > >mybatis快取單元測試

mybatis快取單元測試

Dao介面

@Mapper
public interface Ky_s_ship_miss_dtlDao {
	
	List<Map<String,Object>> list(Map<String,Object> map);
	
}

mapper.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="com.bootdo.witdbct.miss.dao.Ky_s_ship_miss_dtlDao">
    <!--該xml檔案下所有select都使用快取-->
	<cache/>
	<!--結果集如果返回實體,model 類要實現 java Serializable 介面-->
	<select id="list" resultType="Map">
	    ....
	</select>
    <!--個別不用快取的另外備註useCache-->
	<select id="list2" resultType="Map" useCache="false">
	    ....
	</select>
</mapper>
 <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

flushInterval(重新整理間隔) 可以被設定為任意的正整數,而且它們代表一個合理的毫秒 形式的時間段。預設情況是不設定,也就是沒有重新整理間隔,快取僅僅呼叫語句時重新整理。
size(引用數目) 可以被設定為任意正整數,要記住你快取的物件數目和你執行環境的可用記憶體資源數目。預設值是 1024。
readOnly(只讀) 屬性可以被設定為true或false。只讀的快取會給所有呼叫者返回緩 存物件的相同例項。因此這些物件不能被修改。這提供了很重要的效能優勢。可讀寫的快取 會返回快取物件的拷貝(通過序列化) 。這會慢一些,但是安全,因此預設是 false。
eviction

(收回策略)有:
LRU – 最近最少使用的:移除最長時間不被使用的物件。(預設)
FIFO – 先進先出:按物件進入快取的順序來移除它們。
SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的物件。
WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的物件。

單元測試類

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestDemo {
    @Autowired
    private Ky_s_ship_miss_dtlDao dataDao;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    /**
     * 測試mybatis一級快取,一個session共享一份快取
     */
    @Test
    public void TestDaoMethod(){
   		 //查詢條件
        Map<String,Object> param = new HashMap<>();
        param.put("offset",0);
        param.put("limit",20);
        param.put("areaId",1);
        param.put("start_time","2018-07-01 10:30:00");
        param.put("end_time","2018-07-31 10:29:59");
        Long start = System.currentTimeMillis();
        List<Map<String,Object>>  aa = dataDao.list(param);
        Long end = System.currentTimeMillis();
        System.out.println("首次查詢數:"+(end-start));
        start = System.currentTimeMillis();
        List<Map<String,Object>>  bb = dataDao.list(param);
        end = System.currentTimeMillis();
        System.out.println("再次查詢數:"+(end-start));
    }

    /**
     * 測試mybatis二級快取,多個session共享一份快取
     */
    @Test
    public void TestDaoMethod2(){
        //查詢條件
        Map<String,Object> param = new HashMap<>();
        param.put("offset",0);
        param.put("limit",50);
        param.put("areaId",1);
        param.put("start_time","2018-07-01 10:30:00");
        param.put("end_time","2018-07-31 10:29:59");
        SqlSession sqlSession1=null;
        SqlSession sqlSession2=null;
        sqlSession1=sqlSessionFactory.openSession();
        sqlSession2=sqlSessionFactory.openSession();
        //生成代理類
        Ky_s_ship_miss_dtlDao orderMapper=sqlSession1.getMapper(Ky_s_ship_miss_dtlDao.class);
        Ky_s_ship_miss_dtlDao orderMapper2=sqlSession2.getMapper(Ky_s_ship_miss_dtlDao.class);

        Long start = System.currentTimeMillis();
        List<Map<String,Object>>  aa = orderMapper.list(param);
        Long end = System.currentTimeMillis();
        sqlSession1.close();
        System.out.println("首次查詢:"+(end-start));
        start = System.currentTimeMillis();
        List<Map<String,Object>>  bb = orderMapper2.list(param);
        sqlSession2.close();
        end = System.currentTimeMillis();
        System.out.println("再次查詢:"+(end-start));
    }

}