MyBatis之一级缓存和二级缓存问题
作者:源末coco
这篇文章主要介绍了MyBatis之一级缓存和二级缓存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
MyBatis缓存介绍
MyBatis 是一款优秀的持久层框架,它提供了缓存功能来减少数据查询时的数据库交互次数,从而提高查询性能。
MyBatis 的缓存分为一级缓存和二级缓存两种类型。
缓存分类
- 根据缓存存放位置,缓存可以分为本地缓存和分布式缓存。
- 根据缓存作用范围,缓存可以分为永久缓存和临时缓存。
在 MyBatis 中,根据作用范围,分别有一级缓存和二级缓存两种类型。
一级缓存与二级缓存的区别
1.作用范围
- 一级缓存的作用范围是 SqlSession 的生命周期
- 二级缓存的作用范围是整个应用程序的生命周期
2.实现方式
- 一级缓存是通过 SqlSession 内置的一个 HashMap 来实现的
- 而二级缓存则是通过配置 Cache 接口来实现的
3.共享机制
- 一级缓存只能在同一个 SqlSession 内部共享
- 二级缓存可以在多个 SqlSession 之间共享
4.缓存规则
- 一级缓存默认开启并且无法关闭;
- 二级缓存需要手动开启并进行配置
MyBatis缓存原理
MyBatis 的缓存本质上是一个 HashMap,它的键是查询语句和参数的组合,值是查询结果。
当我们执行一个查询时,MyBatis 会先从缓存中查找对应的查询结果,如果缓存中存在,则直接返回缓存的结果;如果缓存中不存在,则从数据库中查询数据,并将查询结果存入缓存中。
每个 SqlSession 都有自己的缓存,因此在不同的 SqlSession 中执行同一个查询语句,它们所使用的缓存是不同的。
同时,MyBatis 的缓存是基于引用计数的机制实现的,当查询语句被多次引用时,缓存的引用计数会加 1,只有当引用计数为 0 时,缓存才会被真正的清除。
使用缓存
1.一级缓存的使用
在同一个 SqlSession 中,同样的 SQL 查询只会执行一次,并把查询结果缓存到 SqlSession 内置的 HashMap 中。
下面是示例代码:
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user1 = userMapper.selectUserById(1); User user2 = userMapper.selectUserById(1); System.out.println(user1 == user2); // true sqlSession.close();
2.二级缓存的使用
需要在 XML 映射文件中添加 <cache>
标签来开启二级缓存,并指定缓存实现类。
下面是示例代码:
<cache/>
需要注意的是,如果要使用二级缓存,需要让你的实体类实现 Serializable 接口。
缓存的使用场景
缓存的使用场景主要包括以下两种情况:
1.某些数据被经常访问
- 如果某些数据经常被访问,
- 那么将这些数据缓存起来,
- 可以减少数据库交互次数,提高系统性能。
2.数据存储较大,查询耗时较长
- 如果某些数据存储较大,且查询这些数据的效率比较低
- 那么可以将查询结果缓存下来,
- 下次需要查询时,直接从缓存中读取。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。