MyBatis 的緩存機制

緩存機制能夠減輕數據庫的壓力,原理是在第一查詢時,將查詢結果緩存起來,以後再查詢一樣的sql,mysql

不是真的去查詢數據庫,而是直接返回緩存中的結果。sql

緩存能夠下降數據庫的壓力,但同時可能沒法獲得最新的結果數據。數據庫

1.數據庫緩存的實現:

經過第三方工具實現緩存:緩存

  Redis內存數據庫 - 能夠實現緩存session

經過MyBatis提供的緩存機制來實現緩存:mybatis

  一級緩存:app

緩存只在一個事務中有效,即同一個事務中前後執行屢次同一個查詢,只在第一次真正去查庫,並將結果緩存,以後的查詢都直接獲取緩存中的中數據。若是是不一樣的事務,則緩存無效。ide

  二級緩存:工具

緩存在全局有效,一個事務查詢一個sql獲得結果,會被緩存起來,以後只要緩存未被清楚,則其餘事務若是查詢同一個sql,獲得的將會是以前緩存的結果。二級緩存做用範圍大,做用時間長,可能形成的危害也更大,因此在開發中通常不多啓用Mybatis的二級緩存。測試

2.MyBatis的一級緩存

MyBatis的一級緩存默認就是開啓的

    // 根據配置文件建立sqlSessionFactory
    private SqlSessionFactory factory = null;
    @Before
    public void before() throws Exception{
        //1.讀取MyBatis核心配置文件
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //2.根據配置文件建立sqlSessionFactory
        factory = new SqlSessionFactoryBuilder().build(in);
    }
    
    /**
     * 一級緩存
     */
    @Test
    public void test16(){
        //1.建立sqlSession
        SqlSession session = factory.openSession();
        //2.執行操做
        List<User> list1 = session.selectList("cn.tedu.mybatis.beans.UserMapper.queryAll");
        List<User> list2 = session.selectList("cn.tedu.mybatis.beans.UserMapper.queryAll");
        //3.打印結果
        System.out.println(list1);
        System.out.println(list2);
    }

測試結果:

2018-10-27 14:41:53,932 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@18987a33]
2018-10-27 14:41:53,932 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==>  Preparing: select * from user 
2018-10-27 14:41:53,957 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==> Parameters: 
[User [id=1, name=aaa, age=19], User [id=2, name=bbb, age=29], User [id=4, name=ddd, age=22], User [id=5, name=eee, age=33], User [id=7, name=cjj, age=24]]
[User [id=1, name=aaa, age=19], User [id=2, name=bbb, age=29], User [id=4, name=ddd, age=22], User [id=5, name=eee, age=33], User [id=7, name=cjj, age=24]]

只在第一次查詢時走了數據庫,後續的查詢走緩存。

配置禁止一級緩存

    <select id="queryAll" flushCache="true" resultType="Alias_User">
        <include refid="saUser"/>
    </select>
2018-10-27 14:48:08,832 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@427eb6e2]
2018-10-27 14:48:08,833 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==>  Preparing: select * from user 
2018-10-27 14:48:08,857 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==> Parameters: 
2018-10-27 14:48:08,874 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@427eb6e2]
2018-10-27 14:48:08,874 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==>  Preparing: select * from user 
2018-10-27 14:48:08,874 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryAll] - ==> Parameters: 
[User [id=1, name=aaa, age=19], User [id=2, name=bbb, age=29], User [id=4, name=ddd, age=22], User [id=5, name=eee, age=33], User [id=7, name=cjj, age=24]]
[User [id=1, name=aaa, age=19], User [id=2, name=bbb, age=29], User [id=4, name=ddd, age=22], User [id=5, name=eee, age=33], User [id=7, name=cjj, age=24]]

3.MyBatis的二級緩存

MyBatis的二級緩存默認是關閉的

    // 根據配置文件建立sqlSessionFactory
    private SqlSessionFactory factory = null;
    @Before
    public void before() throws Exception{
        //1.讀取MyBatis核心配置文件
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //2.根據配置文件建立sqlSessionFactory
        factory = new SqlSessionFactoryBuilder().build(in);
    }
    
    /**
     * 緩存機制:二級緩存
     */
    @Test
    public void test17(){
        //1.第一次事務
        SqlSession session1 = factory.openSession();
        User user1 = session1.selectOne(
                "cn.tedu.mybatis.beans.UserMapper.queryOne",1);
        session1.commit();
        //2.第二次事務
        SqlSession session2 = factory.openSession();
        User user2 = session2.selectOne(
                "cn.tedu.mybatis.beans.UserMapper.queryOne",1);
        session2.commit();
        //3.打印結果
        System.out.println(user1);
        System.out.println(user2);
    }

測試結果:

2018-10-27 14:49:58,913 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@58648016]
2018-10-27 14:49:58,913 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==>  Preparing: select * from user where id = ? 
2018-10-27 14:49:58,935 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==> Parameters: 1(Integer)
2018-10-27 14:49:58,959 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@35f03691]
2018-10-27 14:49:58,959 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==>  Preparing: select * from user where id = ? 
2018-10-27 14:49:58,959 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==> Parameters: 1(Integer)
User [id=1, name=aaa, age=19]
User [id=1, name=aaa, age=19]

配置選項開啓二級緩存

在sqlMapConfig.xml配置

    <!-- 開啓二級緩存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

在映射文件中配置

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

想要被二級緩存緩存的bean必須實現序列化接口

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

測試類:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

運行結果:

2018-10-27 14:57:36,745 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@1dd49247]
2018-10-27 14:57:36,746 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==>  Preparing: select * from user where id = ? 
2018-10-27 14:57:36,772 [main] DEBUG [cn.tedu.mybatis.beans.UserMapper.queryOne] - ==> Parameters: 1(Integer)
User [id=1, name=aaa, age=19]
User [id=1, name=aaa, age=19]
相關文章
相關標籤/搜索