MyBatis的緩存機制

前言


MyBatis中容許使用緩存,分爲一級緩存和二級緩存,下面看下MyBatis中如何配置緩存。sql

一級緩存和二級緩存


ps:下面代碼省略主配置文件和sql映射文件,直接給出測試方法。數據庫

public class MyBatisTest {

    // 獲取SqlSessionFactory對象
    private SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 兩級緩存:
     *  一級緩存:(本地緩存), 在SqlSession上的緩存, 一級緩存一直開啓;sqlSession級別的一個Map
     *      1. 與數據庫同一次會話期間查詢到的數據會放在本地緩存中,之後若是須要獲取相同的數據,沒有必要在查詢數據庫
     *      
     *      2. 一級緩存失效的狀況(沒有使用到當前一級緩存的狀況,效果就是,還須要再向數據庫發出查詢)
     *          1. sqlSession不一樣
     *          2. sqlSession相同,查詢條件不一樣(當前緩存中尚未這個數據)
     *          3. sqlSession相同,兩次查詢之間執行了增刪改操做(此次增刪改可能對當前數據有影響)
     *          4. sqlSession相同,手動清除了一級緩存(緩存清空)
     * 
     *  二級緩存:(全局緩存), 在SqlSessionFactory上的緩存,基於namespace級別的緩存,一個namespace對應一個二級緩存
     *      1. 工做機制:
     *          一、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
     *          二、若是會話關閉,一級緩存中的數據會被保存到二級緩存中,新的會話查詢信息,就能夠參照二級緩存中的內容;
     *          三、不一樣namespace查出的數據會放在本身對應的map(緩存)中
     *      
     *      2. 使用:
     *          一、開啓全局二級緩存設置:
     *          二、去mapper.xml中進行配置
     *          三、咱們的POJO須要實現序列化接口
     *      
     *      3. 效果:
     *          數據會從二級緩存中獲取;只有會話提交或關閉後,一級緩存中的數據纔會轉移到二級緩存中
     *          
     * @throws IOException 
     */

    //測試二級緩存
    @Test
    public void testSecondLevelCache() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        SqlSession openSession2 = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);

            Employee emp01 = mapper.getEmployeeById(3);
            System.out.println(emp01);
            openSession.close();

            //第二次查詢是從二級緩存中拿到的數據,並無發送新的sql
            Employee emp02 = mapper2.getEmployeeById(3);
            System.out.println(emp02);
            System.out.println(emp01 == emp02);
        } finally {
            openSession2.close();
        }
    }

    //測試一級緩存
    @Test
    public void testFirstLevelCache() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee emp01 = mapper.getEmployeeById(3);
            System.out.println(emp01);

            Employee emp02 = mapper.getEmployeeById(3);
            System.out.println(emp02);
            System.out.println(emp01 == emp02);
        } finally {
            openSession.close();
        }
    }
}

敲重點:二級緩存的配置
 一、 在主配置文件中開啓二級緩存總開關
MyBatis的緩存機制
 二、sql映射文件中開啓二級緩存
MyBatis的緩存機制
 三、POJO實現序列化接口
MyBatis的緩存機制緩存

緩存的原理


MyBatis的緩存機制

相關文章
相關標籤/搜索