深入浅出 最新版 MyBatis-3.5.6_ 8. MyBatis 缓存

我们不难知道,数据是存储在计算机硬盘上,如果我们频繁的从数据库读取数据,时间长了会造成数据库堵塞,IO 开销高了之后,性能大打折扣。

所以为了能够减少从数据库读取,我们引入了缓存这个东西。

MyBatis 中提供了两种缓存,一级缓存和二级缓存。

一、MyBatis 一级缓存

MyBatis 中默认是开启一级缓存的,而一级缓存是 SqlSession 级别的缓存。

我们学习的时候,需要构建 SqlSession,而在这个对象中有一个数据结构( HashMap ),用于存储缓存数据。并且不同的sqlSession之间的缓存区域(HashMap)是互不影响的。

所以在参数和SQL完全一样的情况下,我们使用同一个 SqlSession 对象调用一个 Mapper 方法,往往只执行一次 SQL,因为使用 SelSession 第一次查询后,MyBatis 会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据,而不会再次发送SQL到数据库。

一级缓存的生命周期有多长?

MyBatis 在开启一个数据库会话时,会创建一个新的 SqlSession 对象,SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新的 PerpetualCache 对象;

当会话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。

如果 SqlSession 调用了 close() 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。

如果 SqlSession 调用了 clearCache(),会清空 PerpetualCache 对象中的数据,但是该对象仍可使用。

SqlSession 中执行了任何一个 需要commit 操作,都会清空 PerpetualCache 对象的数据,但是该对象可以继续使用。

怎么判断某两次查询是完全相同的查询?

mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。

1. 传入的statementId

2. 查询时要求的结果集中的结果范围

3. 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )

4. 传递给java.sql.Statement要设置的参数值

二、MyBatis 二级缓存

MyBatis 中默认二级缓存是没有开启的,这个需要用户自己进行操作。

MyBatis 中二级缓存开启后,同一个命名空间(namespace)所有的操作语句,都影响着一个共同的 cache,也就是二级缓存被多个 SqlSession 共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

这也就是说,在同一个 namespace 中,是使用的同一个缓存,这也就是我们前面说的,为啥要规定 namespace。

一级缓存我们就不管了,我们主要来进行二级缓存的实践。

首先是开启二级缓存,我们去 mybatis-config.xml 中添加一个 settings

这样我们就算是开启了缓存了。

接着我们去使用一下缓存,使用缓存我们需要去到一个 Mapper.xml,并且给这个 namespace 中添加全局的二级缓存,只需要在你的 SQL 映射文件中添加一行 cache 标签即可,如下图

然后我们写一个方法来测试一下。

然后我们需要给我们的 select 和 insert 添加一些属性

核心是这个,这个不加的话,肯定是不使用缓存,切记!!!详细可以看官方文档

然后我们写好实现,现在来测试一下。

我们打一个断点,因为一会要在断点处进行操作。debug 运行一下

可以看到,有两个,现在我们数据库强行添加一个,再来看看有多少

可以看到啊,还是 2,原因就是这个数据并没有去数据库查询,而是直接动的缓存。

我们现在又往数据库添加了一条,我们再来看看这次获取的是多少。

可以看到啊,是 4,也就是说,我们的缓存被刷新了。

当然啊

这个报错没有关系,这个是因为我们没有将我们的实体进行序列化,自己操作一下,实现一下接口就可以了。

三、二级缓存的配置

cache 元素有很多属性,这些属性可以改变缓存,我们来看看有那些属性~

我直接拷贝官网上的好了,大家可以看看,自己进行配置,然后测试一下~~~

四、缓存的引用

我们之前有学习过连表查询,一对一、一对多查询。这样的查询也同样可以使用缓存。

这里我们可以使用缓存的引用

可以看官网的例子

到这里为止,我们的 MyBatis 缓存 就完成了,东西有点多,大家好好消化一下。

大家可以自己好好查查看,有不懂的可以联系我 QQ:2100363119

欢迎大家访问我的网站:https://www.lemon1234.com

可以的话关注一下我的公众号,就在我网站,每天都有更新~~~,无限资源畅游 Java,感谢~

猜你喜欢

转载自blog.csdn.net/weixin_45908370/article/details/114277185
今日推荐