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的缓存,接下来我会再写一篇博文,进行深入解析。感谢关注。