缓存的作用,主要是为了提高查询访问速度,某些数据被频繁查询时,可以缓存到内存中而不是每次都从数据库查询,这样可以减轻数据库压力。
MyBatis的缓存机制,根据缓存的作用域(生命周期)可以划分为2种:一级查询缓存和二级查询缓存。
一级缓存介绍
一级缓存是SqlSession级别的缓存。每个SqlSession中持有了Executor,每个Executor中有一个HashMap类型的Cache(我们称为Local cache)。不同的SqlSession之间的缓存数据区域(HashMap)是互相不影响的。其作用域是SqlSession,当一个SqlSessoin结束后,该SqlSession中的一级查询缓存也就不存在了。
当用户发起查询时,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库结果写入Local Cache,最后返回结果给用户。
一级缓存失效问题
@Test public void testQueryById() { System.out.println(empService.queryById(7369)); System.out.println(empService.queryById(7369)); }
运行结果
Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66d25ba9] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.jdbc.JDBC4Connection@31efacad] will not be managed by Spring ==> Preparing: SELECT * FROM t_emp WHERE empno=? ==> Parameters: 7369(Integer) <== Columns: empno, ename, job, mgr, hiredate, sal, comm, deptno <== Row: 7369, SMITH, CLERK, 7902, 1980-12-17, 800.00, null, 20 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66d25ba9] Emp{empno=7369, ename='SMITH', job='CLERK', mgr=7902, hiredate=Wed Dec 17 00:00:00 CST 1980, sal=800.0, comm=null, deptno=20, skillList=null} Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2df65a56] was not registered for synchronization because synchronization is not active JDBC Connection [com.mysql.jdbc.JDBC4Connection@31efacad] will not be managed by Spring ==> Preparing: SELECT * FROM t_emp WHERE empno=? ==> Parameters: 7369(Integer) <== Columns: empno, ename, job, mgr, hiredate, sal, comm, deptno <== Row: 7369, SMITH, CLERK, 7902, 1980-12-17, 800.00, null, 20 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2df65a56] Emp{empno=7369, ename='SMITH', job='CLERK', mgr=7902, hiredate=Wed Dec 17 00:00:00 CST 1980, sal=800.0, comm=null, deptno=20, skillList=null}
从上面的结果可以看出,执行2次queryById方法分别创建了2次SqlSession,也就是mybatis的一级缓存没有起作用,这是因为与spring框架整合后的导致的。
mybatis的会话提供了编程式的事务管理,通过SqlSession.commit(), SqlSession.rollback() or SqlSession.close()这些方法进行事务管理。但是当与spring整合后,事务将交由spring管理,这就意味着你不能手动编程式的管理事务了。spring对mybatis的sqlsession的使用是由template控制的,每次
继续阅读与本文标签相同的文章
上一篇 :
简单搭建Django框架
下一篇 :
美媒盘点:2018年将改变世界的四大技术趋势
-
小狗分类器,你家的狗子是个什么狗?
2026-05-19栏目: 教程
-
安卓开发开发规范手册V1.0
2026-05-19栏目: 教程
-
备战金九银十,跳槽经验分享,我是如何逆袭进入阿里的
2026-05-19栏目: 教程
-
在Win上做Python开发?当然是用官方的MS Terminal和VS Code了
2026-05-19栏目: 教程
-
受用一生的高效 PyCharm 使用技巧(四)
2026-05-19栏目: 教程
