溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis的緩存機制

發(fā)布時間:2020-06-16 17:04:48 來源:網絡 閱讀:402 作者:Adam的blog 欄目:開發(fā)技術

前言


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. 一級緩存失效的情況(沒有使用到當前一級緩存的情況,效果就是,還需要再向數據庫發(fā)出查詢)
     *          1. sqlSession不同
     *          2. sqlSession相同,查詢條件不同(當前緩存中還沒有這個數據)
     *          3. sqlSession相同,兩次查詢之間執(zhí)行了增刪改操作(這次增刪改可能對當前數據有影響)
     *          4. sqlSession相同,手動清除了一級緩存(緩存清空)
     * 
     *  二級緩存:(全局緩存), 在SqlSessionFactory上的緩存,基于namespace級別的緩存,一個namespace對應一個二級緩存
     *      1. 工作機制:
     *          1、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
     *          2、如果會話關閉,一級緩存中的數據會被保存到二級緩存中,新的會話查詢信息,就可以參照二級緩存中的內容;
     *          3、不同namespace查出的數據會放在自己對應的map(緩存)中
     *      
     *      2. 使用:
     *          1、開啟全局二級緩存設置:
     *          2、去mapper.xml中進行配置
     *          3、我們的POJO需要實現序列化接口
     *      
     *      3. 效果:
     *          數據會從二級緩存中獲?。恢挥袝捥峤换蜿P閉后,一級緩存中的數據才會轉移到二級緩存中
     *          
     * @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();

            //第二次查詢是從二級緩存中拿到的數據,并沒有發(fā)送新的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的緩存機制

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI