MyBatis查询缓存

一级缓存:同一个SqlSession对象,MyBatis默认开启一级缓存。

如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询结果放入到SqlSession中(作为缓存存在),后续再次查询该同样的对象时,则直接从缓存中查询该对象即可(即省略了数据库的访问)。当SqlSession执行commit()方法,则清除所有缓存对象。

二级缓存
MyBatis自带二级缓存,同一个namespace生成的mapper对象,所以只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。
如果时同一个SqlSession对象进行多次相同的查询,则直接进入一级缓存查询;如果不是同一个SqlSession对象进行多次相同的查询(但均来自同一个namespace),则进入二级缓存查询。

MyBatis默认情况下没有开启二级缓存,需要手工打开。
第一步:在conf.xml文件中开启二级缓存

	<settings>
 		<!-- 开启二级缓存 -->
 		<setting name="cacheEnabled" value="true"/>
 	</settings>

第二步:在具体的mapper.xml文件中声明开启

<mapper namespace="org.yao.mapper.StudentMapper">
	
	<!-- 声明此namespace开启二级缓存 -->
	<cache/>

MyBatis二级缓存是将对象放入硬盘文件中,执行缓存的对象必须实现序列化接口。
序列化:将内存的数据转换为二进制代码放入硬盘
反序列化:将硬盘中的数据放入内存
序列化Student类时,还要序列化Student类的级联属性以及父类

触发将对象写入二级缓存的时机:SqlSession的close方法。

二级缓存的禁用:
如果在mapper.xml文件中某一个select标签不用二级缓存,则使用select标签的useCache属性:useCache=”false”关闭二级缓存。

二级缓存的清理:
commit()方法可以清理缓存,一般执行增删改时会清理掉缓存,设计的原因时为了防止脏数据,在二级缓存中,commit()不能是自身sqlsession调用的commit()方法。

MyBatis提供了查询缓存来减少数据库访问次数,提高性能。查询缓存是将查询结果缓存起来,当下次相同的查询被执行时,直接从缓存中获取结果,而不再访问数据库。 要启用查询缓存,需要在MyBatis配置文件中进行相关配置。以下是一些相关的配置选项: 1. `<setting name="cacheEnabled" value="true" />`:开启全局的二级缓存,默认为true。 2. `<mapper namespace="com.example.mapper" flushCache="true">`:在mapper中配置flushCache属性为true,表示刷新缓存,使其失效。 3. `<select id="selectUser" resultType="com.example.User" useCache="true">`:在查询语句中配置useCache属性为true,表示使用查询缓存。 默认情况下,MyBatis使用PerpetualCache作为二级缓存的实现,它是一个基于HashMap的缓存实现。MyBatis还支持其他的缓存实现,如Ehcache、Redis等。 需要注意的是,查询缓存是基于查询语句的完全匹配来判断是否使用缓存的。如果有任何一个参数发生变化,即使是相同的SQL语句,也会重新查询数据库而不使用缓存。 另外,MyBatis还提供了一级缓存,默认开启且无法关闭。一级缓存是基于SqlSession的,它的生命周期与SqlSession的生命周期一致,可以通过清除缓存的方式来使其失效。 总的来说,MyBatis查询缓存是一个简单但有效的机制,可以显著提高查询性能,减少数据库访问次数。但需要注意合理配置缓存策略,避免缓存过期或占用过多内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值