MyBatis的緩存機制

前言


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

一級緩存和二級緩存


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. 工作機制:
     *          1、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
     *          2、如果會話關閉,一級緩存中的數據會被保存到二級緩存中,新的會話查詢信息,就可以參照二級緩存中的內容;
     *          3、不同namespace查出的數據會放在自己對應的map(緩存)中
     *      
     *      2. 使用:
     *          1、開啓全局二級緩存設置:
     *          2、去mapper.xml中進行配置
     *          3、我們的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();
        }
    }
}

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

緩存的原理


MyBatis的緩存機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章