mybatis一级二级缓存

mybatis一级二级缓存


前言

缓存在我们的日常开发中经常遇到,尤其在我们操作数据库时,要打开连接,操作数据库,操作完毕后要关闭,整个流程耗时,消耗性能。但是有了缓存机制,我们可以在打开连接之前就判断,是否有缓存,有缓存,则直接从缓存中读取,这样效率提升了数倍。
mybatis缓存分为一级缓存和二级缓存,可以配置相关的设置。
mybatis的一级缓存是相对于SqlSession定义,二级缓存相对于mapper来定义的。

一、mybatis一级缓存

mybatis默认是支持一级缓存的,无需配置。
这里我们测试一下,下面是我的测试代码

   @Test
    public void testOne() {
        SqlSession mSession = null;
        ImsUser imsUser = null;
        ImsUser imsUser2 = null;
        try {
            mSession = SqlSessionUtils.getSqlSession(sqlSessionFactory);
            ImsUserMapper mapper = mSession.getMapper(ImsUserMapper.class);
            imsUser = mapper.findById("1");
            imsUser2 = mapper.findById("1");
            mSession.commit();
        } catch (Exception ex) {
            mSession.rollback();
        } finally {
            mSession.close();
        }
        if (imsUser != null) {
            System.out.println("user1");
            System.out.println(imsUser.toString());
        }
        if (imsUser2 != null) {
            System.out.println("user2");
            System.out.println(imsUser2.toString());
        }
    }

然后运行,可看到日志

[2019-01-30 14:19:27] [main] [DEBUG] [com.fm.mapper.ImsUserMapper:62] -- Cache Hit Ratio [com.fm.mapper.ImsUserMapper]: 0.0
[2019-01-30 14:19:27] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- ==>  Preparing: SELECT * FROM todo_user WHERE id=? 
[2019-01-30 14:19:27] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- ==> Parameters: 1(String)
[2019-01-30 14:19:27] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- <==      Total: 1
[2019-01-30 14:19:27] [main] [DEBUG] [com.fm.mapper.ImsUserMapper:62] -- Cache Hit Ratio [com.fm.mapper.ImsUserMapper]: 0.0
user1
ImsUser(id=1, name=方明, phone=13825123792, password=null, idcard=null, mail=null, createtime=Mon Aug 06 10:22:55 CST 2018)
user2
ImsUser(id=1, name=方明, phone=13825123792, password=null, idcard=null, mail=null, createtime=Mon Aug 06 10:22:55 CST 2018)

通过日志我们可以看到,我们的查询语句只执行了一次。如果不知道怎么设置mybatis的日志,可查看我之前的博文springmvc、springboot使用logback查看myabtis日志

二、mybatis二级缓存

我们使用同一个SqlSessionFactory,声明两个SqlSession来测试一下。
1、在mybatis-config.xml的setting中配置cacheEnabled为ture,旧版本为false,新版本默认是true。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="SLF4J" />
        <!--开启全局二级缓存配置,true为开启,false为不开启,默认是true-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

2、在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.fm.mapper.ImsUserMapper">
    <cache/>

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.fm.entity.ImsUser">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="phone" property="phone" />
        <result column="password" property="password" />
        <result column="password" property="password" />
        <result column="idcard" property="idcard" />
        <result column="mail" property="mail" />
        <result column="createtime" property="createtime" />
    </resultMap>

    <select id="findById" resultType="com.fm.entity.ImsUser">
        SELECT * FROM todo_user WHERE id=#{userid}
    </select>

</mapper>

3、测试一下,代码如下:

    @Test
    public void testTwo() {
        SqlSession mSession1 = null;
        SqlSession mSession2 = null;
        ImsUser imsUser = null;
        ImsUser imsUser2 = null;
        mSession1 = SqlSessionUtils.getSqlSession(sqlSessionFactory);
        ImsUserMapper mapper = mSession1.getMapper(ImsUserMapper.class);
        imsUser = mapper.findById("1");
        mSession1.commit();
        mSession1.close();
        if (imsUser != null) {
            System.out.println("user1");
            System.out.println(imsUser.toString());
        }

        mSession2 = SqlSessionUtils.getSqlSession(sqlSessionFactory);
        ImsUserMapper mapper2 = mSession2.getMapper(ImsUserMapper.class);
        imsUser2 = mapper2.findById("1");
        mSession2.commit();
        mSession2.close();
        if (imsUser2 != null) {
            System.out.println("user2");
            System.out.println(imsUser2.toString());
        }
    }

运行代码,查看日志

[2019-01-30 14:47:54] [main] [DEBUG] [com.fm.mapper.ImsUserMapper:62] -- Cache Hit Ratio [com.fm.mapper.ImsUserMapper]: 0.0
[2019-01-30 14:47:55] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- ==>  Preparing: SELECT * FROM todo_user WHERE id=? 
[2019-01-30 14:47:55] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- ==> Parameters: 1(String)
[2019-01-30 14:47:55] [main] [DEBUG] [com.fm.mapper.ImsUserMapper.findById:159] -- <==      Total: 1
user1
ImsUser(id=1, name=方明, phone=13825123792, password=null, idcard=null, mail=null, createtime=Mon Aug 06 10:22:55 CST 2018)
[2019-01-30 14:47:55] [main] [DEBUG] [com.fm.mapper.ImsUserMapper:62] -- Cache Hit Ratio [com.fm.mapper.ImsUserMapper]: 0.5
user2
ImsUser(id=1, name=方明, phone=13825123792, password=null, idcard=null, mail=null, createtime=Mon Aug 06 10:22:55 CST 2018)

从日志可以看到,sql语句只执行了一次,第二次直接从缓存中获取的数据。

这里只做了简单的测试,关于myabtis的缓存,接下来我会再写一篇博文,进行深入解析。感谢关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值