1. 程式人生 > >Mybatis學習筆記18 - 緩存

Mybatis學習筆記18 - 緩存

demo ssi HERE poj source 本地緩存 .org 一次 finally

兩級緩存:
一級緩存:(本地緩存):sqlSession級別的緩存。一級緩存是一直開啟的;SqlSession級別的一個Map
數據庫同一次會話期間查詢到的數據會放在本地緩存中。以後如果需要獲取相同的數據,直接從緩存中拿,沒必要再去查詢數據庫。
一級緩存失效情況(沒有使用到當前一級緩存的情況,效果就是還需要再向數據庫發出查詢):
1、sqlSession不同。
2、sqlSession相同,查詢條件不同.(當前一級緩存中還沒有這個數據)
3、sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前數據有影響)
4、sqlSession相同,手動清除了一級緩存(緩存清空)
二級緩存全局緩存):基於namespace級別的緩存:一個namespace對應一個二級緩存:
工作機制:
1、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
2、如果會話關閉;一級緩存中的數據會被保存到二級緩存中;新的會話查詢信息,就可以參照二級緩存中的內容;
3、不同namespace查出的數據會放在自己對應的緩存中(map)
效果:數據會從二級緩存中獲取
查出的數據都會被默認先放在一級緩存中。
只有會話提交或者關閉以後,一級緩存中的數據才會轉移到二級緩存中
使用:
1)、開啟全局二級緩存配置:<setting name="cacheEnabled" value="true"/>
2)、去mapper.xml中配置使用二級緩存:<cache></cache>
3)、我們的POJO需要實現序列化接口

和緩存有關的設置/屬性:
1)、cacheEnabled=true:false:關閉緩存(二級緩存關閉)(一級緩存一直可用的)
2)、每個select標簽都有useCache="true":
false:不使用緩存(一級緩存依然使用,二級緩存不使用)
3)、【每個增刪改標簽的:flushCache="true":(一級二級都會清除)】
增刪改執行完成後就會清楚緩存;
測試:flushCache="true":一級緩存就清空了;二級也會被清除;
查詢標簽:flushCache="false":
如果flushCache=true;每次查詢之後都會清空緩存;緩存是沒有被使用的;
4)、sqlSession.clearCache();只是清楚當前session的一級緩存;
5)、localCacheScope:本地緩存作用域:(一級緩存SESSION);當前會話的所有數據保存在會話緩存中;
STATEMENT:可以禁用一級緩存;
第三方緩存整合:
1)、導入第三方緩存包即可;
2)、導入與第三方緩存整合的適配包;官方有;
3)、mapper.xml中使用自定義緩存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

一、測試緩存效果

示例代碼:

接口定義:
package com.mybatis.dao;

import com.mybatis.bean.Employee;

public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
}


mapper定義:
<?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.mybatis.dao.EmployeeMapper">
    <select id="getEmpById" resultType="com.mybatis.bean.Employee">
        select * from tbl_employee where id=#{id}
    </select>
</mapper>


測試代碼:
package com.mybatis.demo;

import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyTest {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession(true);
        SqlSession openSession2 = sqlSessionFactory.openSession();
        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee emp1 = mapper.getEmpById(1);
            System.out.println(emp1);
            System.out.println("---------");
            Employee emp2 = mapper.getEmpById(1);
            System.out.println(emp2);
            System.out.println(emp1 == emp2);
            System.out.println(emp1.equals(emp2));
        } finally {
            openSession.close();
        }
    }
}

二、一級緩存失效情況

Mybatis學習筆記18 - 緩存