前言
本篇博文是关于MyBatis缓存的执行顺序,希望能够帮助到您
个人主页:晨犀主页
个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力
欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦
文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache
缓存执行顺序是:二级缓存–>一级缓存–>数据库
说的再多不如眼见为实,让我们用代码来证明吧
@Test
public void cacheSeqTest() {
System.out.println("查询第1次");
//DB, 会发出SQL, 分析cache hit ratio 0.0
Monster monster1 = monsterMapper.getMonsterById(3);
System.out.println(monster1);
//这里关闭sqlSession, 一级缓存数据没有
//当我们关闭一级缓存的时候,如果你配置二级缓存,那么一级缓存的数据,会放入到二级缓存
sqlSession.close();
sqlSession = MyBatisUtils.getSqlSession();
monsterMapper = sqlSession.getMapper(MonsterMapper.class);
System.out.println("查询第2次");
//从二级缓存获取id=3 monster , 就不会发出SQL, 分析cache hit ratio 0.5
Monster monster2 = monsterMapper.getMonsterById(3);
System.out.println(monster2);
System.out.println("查询第3次");
//从二级缓存获取id=3 monster, 不会发出SQL, 分析cache hit ratio 0.6666
Monster monster3 = monsterMapper.getMonsterById(3);
System.out.println(monster3);
if (sqlSession != null) {
sqlSession.close();
}
System.out.println("操作成功");
}
查询第1次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Opening JDBC Connection
Created connection 527829831.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
==> Preparing: SELECT * FROM `monster` WHERE id = ?
==> Parameters: 3(Integer)
<== Columns: id, age, birthday, email, gender, name, salary
<== Row: 3, 51, 4015-09-12, qwrw@df.com, 1, 风衣精, 1965
<== Total: 1
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
Returned connection 527829831 to pool.
查询第2次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.5
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第3次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.6666666666666666
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
操作成功
//分析缓存执行顺序
//二级缓存->一级缓存->DB
//因为二级缓存(数据)是在一级缓存关闭之后才有的
@Test
public void cacheSeqTest2() {
System.out.println("查询第1次");
//DB , 会发出 SQL, cache hit ratio 0.0
Monster monster1 = monsterMapper.getMonsterById(3);
System.out.println(monster1);
//这里我们没有关闭sqlSession
System.out.println("查询第2次");
//从一级缓存获取id=3 , cache hit ratio 0.0, 不会发出SQL
Monster monster2 = monsterMapper.getMonsterById(3);
System.out.println(monster2);
System.out.println("查询第3次");
//还是从一级缓存获取id=3, cache hit ratio 0.0, 不会发出SQL
Monster monster3 = monsterMapper.getMonsterById(3);
System.out.println(monster3);
if (sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
System.out.println("操作成功");
}
查询第1次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Opening JDBC Connection
Created connection 485845532.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
==> Preparing: SELECT * FROM `monster` WHERE id = ?
==> Parameters: 3(Integer)
<== Columns: id, age, birthday, email, gender, name, salary
<== Row: 3, 51, 4015-09-12, qwrw@df.com, 1, 风衣精, 1965
<== Total: 1
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第2次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第3次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
Returned connection 485845532 to pool.
操作成功
热门专栏推荐
对缓存感兴趣的朋友可以看看博主的缓存篇–
MyBatis缓存-提高检索效率的利器–一级缓存
MyBatis缓存-提高检索效率的利器–二级缓存
文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力