Mybatis的一级缓存和二级缓存原理分析与使用
目录
- Mybatis的一级缓存和二级缓存
- 1 Mybatis如何判断两次查询是完全相同的查询
- 2 二级缓存
- 2.1 二级缓存配置
- 2.2 二级缓存特点
- 2.3 配置二级缓存
- 2.4 测试
Mybatis的一级缓存和二级缓存 Mybatis会将相同查询条件的SQL语句的查询结果存储在内存或者某种缓存介质中,当下次遇到相同的SQL时不执行该SQL,而是直接从缓存中获取结果,减少服务器的压力,尤其是在查询越多、缓存命中率越高的情况下,使用缓存对性能的提高更明显。
Mybatis缓存分为一级缓存和二级缓存,一级缓存是将结果缓存在SqlSession对象中,二级缓存是存储在SqlSessionFactory对象中。默认情况下,Mybatis开启一级缓存,不开启二级缓存当数据量更大时,可以借助第三方缓存技术协助保存Mybatis的二级缓存数据
文章图片
如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用 SqlSession中执行了任何一个update操作(update()、delete()、insert()),都会清空PerpetualCache对象的数据,但是该对象可以继续使用
1 Mybatis如何判断两次查询是完全相同的查询
如果以下条件完全一样,Mybatis则认为是相同的查询
-- 传入的statementid。
-- 查询时要求的结果集中的结果范围
-- 这次查询所产生的最终要传递给Preparedstatement的Sql语句字符串
-- 传递的参数值
@Testpublic void testCacheOne(){SqlSession sqlSession = MybatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); Users users = userDao.selectUsersById(1); Users users1 = userDao.selectUsersById(1); System.out.println(users); System.out.println(users1); }
文章图片
查询两次,数据库查询了一次
@Testpublic void testCacheOne(){SqlSession sqlSession = MybatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); Users users = userDao.selectUsersById(1); //清空缓存sqlSession.clearCache(); Users users1 = userDao.selectUsersById(1); System.out.println(users); System.out.println(users1); }
文章图片
清空缓存,数据库查询了两次
2 二级缓存
? Mybatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,二级缓存SqlSessionFactory上缓存,可以是由一个SqlSessionFactory创建的不同的SqlSession之间共享缓存数据。默认不开启。SqlSession在执行commit()或者close()的时候将数据放入到二级缓存
文章图片
文章图片
2.1 二级缓存配置 Mybatis实现二级缓存的实体类必须是可序列化的,也就是要求实现Serializable接口。在映射配置文件中配置就可以开启缓存了
2.2 二级缓存特点 映射语句文件中的所有select查询语句都会被缓存
insert、update、delete语句会刷新缓存
二级缓存是以namespace为单位,不同namespace下的操作互不影响
如果在加入
2.3 配置二级缓存 在mybatis-config.xml文件中标签配置开启二级缓存。cacheEnabled的值就是true,可省略
在映射文件中添加
2.4 测试
文章图片
@Testpublic void testCacheTwo(){SqlSession sqlSession=MybatisUtil.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); Users users = userDao.selectUsersById(1); System.out.println(users); //关闭SqlSession后,重新获取SqlSession对象查询MybatisUtil.closeSqlSession(); SqlSession sqlSession2=MybatisUtil.getSqlSession(); UserDao userDao2 = sqlSession2.getMapper(UserDao.class); Users users2 = userDao2.selectUsersById(1); System.out.println(users2); }
文章图片
查询了一次,可以看出不同的SqlSession之间共享缓存数据。
【Mybatis的一级缓存和二级缓存原理分析与使用】到此这篇关于Mybatis的一级缓存和二级缓存原理分析与使用的文章就介绍到这了,更多相关Mybatis 缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 基于spring注入为null的原因及解决方案
- JPA|JPA @Query时,无法使用limit函数的问题及解决
- 关于@Query注解的用法(Spring|关于@Query注解的用法(Spring Data JPA)
- java中的类型自动转换机制解析
- 国产化之Arm64|国产化之Arm64 CPU+银河麒麟系统安装.NetCore的步骤详解
- 国产化之银河麒麟安装.netcore3.1的详细步骤(手动安装)
- vue跳转页面常用的4种方法与区别小结
- linq中的分区操作符
- php实现归并排序算法的方法详解
- 如何在|如何在 SAP BTP 平台上重用另一个已经开发好的 service