Java关于MyBatis缓存详解
作者:DrLai 发布时间:2021-11-01 00:40:20
标签:Java,MyBatis,缓存
什么是 MyBatis 缓存
使⽤缓存可以减少 Java 应⽤与数据库的交互次数,从而提升程序的运行效率。⽐如查询出 id = 1 的对象,第⼀次查询出之后会自动将该对象保存到缓存中,当下⼀次查询时,直接从缓存中取出对象即可, 无需再次访问数据库。
MyBatis 缓存分类
1.⼀级缓存:SqlSession级别,默认开启,并且不能关闭.(默认开启)
操作数据库时需要创建 SqlSession 对象,在对象中有⼀个 HashMap ⽤于存储缓存数据,不同的 SqlSession 之间缓存数据区域是互不影响的。 ⼀级缓存的作用域是 SqlSession 范围的,当在同⼀个 SqlSession 中执⾏两次相同的 SQL 语句事,第⼀ 次执行完毕会将结果保存到缓存中,第⼆次查询时直接从缓存中获取。 需要注意的是,如果 SqlSession 执行了 DML 操作(insert、update、delete),MyBatis 必须将缓存清空以保证数据的准确性。
2.二级缓存:Mapper 级别,默认关闭,可以开启
使⽤⼆级缓存时,多个 SqlSession 使⽤同⼀个 Mapper 的 SQL 语句操作数据库,得到的数据会存在⼆ 级缓存区,同样是使⽤ HashMap 进⾏数据存储,相⽐较于⼀级缓存,⼆级缓存的范围更⼤,多个 SqlSession 可以共⽤⼆级缓存,⼆级缓存是跨 SqlSession 的。 ⼆级缓存是多个 SqlSession 共享的,其作⽤域是 Mapper 的同⼀个 namespace,不同的 SqlSession 两次执⾏相同的 namespace 下的 SQL 语句,参数也相等,则第⼀次执⾏成功之后会将数据保存到⼆级 缓存中,第⼆次可直接从⼆级缓存中取出数据。
二级缓存如何使用
1.MyBatis 自带的二级缓存
1.1config.xml 配置开启⼆级缓存
settings>
<!-- 打印SQL-->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启⼆级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
1.2Mapper.xml 中配置⼆级缓存
<cache></cache>
1.3实体类实现序列化接口
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account implements Serializable {
private long id;
private String username;
private String password;
private int age;
}
2.ehcache 二级缓存(第三方)
2.1pom.xml 添加相关依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.3</version>
</dependency>
2.2添加 ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore/>
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
2.3config.xml 配置开启⼆级缓存
<settings>
<!-- 打印SQL-->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启⼆级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
2.4 Mapper.xml 中配置⼆级缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
<!-- 缓存创建之后,最后⼀次访问缓存的时间⾄缓存失效的时间间隔 -->
<property name="timeToIdleSeconds" value="3600"/>
<!-- 缓存⾃创建时间起⾄失效的时间间隔 -->
<property name="timeToLiveSeconds" value="3600"/>
<!-- 缓存回收策略,LRU表示移除近期使⽤最少的对象 -->
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>
来源:https://blog.csdn.net/DrLai/article/details/119786974


猜你喜欢
- 本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下跟随算法要实现3D摄像机的控制第一步就是先实现摄像机跟
- 前言关键字Final不仅可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本文将从类与方法两个方面介绍final关键字的功能。Fina
- 目录1.使用双重for循环打印九九乘法表2.使用双重for循环打印九九乘法表,跳过第五行3.使用do{}while()实现打印九九乘法表1.
- 代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。所以我们不是为写注释
- 一、前期工作创建工作空间 二、创建工作包创建完成后,文件夹的格式为:三、准备编译文件和代码3.1 更换编译文件中的内容将上图中的,
- 反阈值二值化反阈值二值化与阈值二值化互为逆操作。在OpenCV中该类的实现依赖于threshold() 函数。下面是该函数的声明:thres
- 类型转换Convert.To类型()1、表达式将变量和字面值(在使用运算符时,他们都称作操作数)与运算符组合起来就得到了表达式,它是计算的基
- 下面代码看下java判断http地址是否连通private boolean isOk(String url) {
- 1.System.currentTimeMills():得到当前时间距离时间原点的毫秒数,返回值是Long类型的整数。代码演示:public
- 初始化方式一:@PostConstruct注解假设类UserController有个成员变量UserService被@Autowired修饰
- 一、短信登录验证机制原理分析了解短信验证码的登陆机制之前,我们首先是要了解用户账号密码登陆的机制是如何的,我们来简要分析一下Spring S
- 1.springBoot的依赖确定项目中包含可以注解的依赖<dependency> <group
- 一、环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形
- 本文实例讲述了C#实现在启动目录创建快捷方式的方法。分享给大家供大家参考。具体如下:添加引用,选择 COM 选项卡并选择 Windows S
- 说明Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序。 这些应用程序通过 Spring
- 缘起:去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下。程序效果:按下空格显示路径:思考过程:迷宫由一个一个格子组成,要求从入口
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- 在对类访问使用时,常用到的有访问类的成员、方法。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现。由于
- 本文实例展示了DevExpress实现为TextEdit设置水印文字的方法,是一个很实用的技巧。分享给大家供大家参考。关键代码如下:publ
- 报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限