首页 > 编程知识 正文

mybatis二级缓存能否不清空,数据库索引失效的场景

时间:2023-05-04 06:59:30 阅读:32555 作者:2213

本文主要介绍了Mybatis缓存的原理和失效情况分析,本文通过示例代码进行了非常详细的介绍,对大家的学习和工作有一定的参考学习价值,有需要的朋友可以参考

1、什么是缓存[Cache]

内存中存在临时数据。

将用户经常查询的数据放在缓存(内存)中,当用户查询数据时,从缓存而不是从关系数据库的数据文件(磁盘)中)进行查询,从而提高查询效率

2、为什么要使用现金

减少与数据库的交互次数,减少系统开销,提高系统效率。

3、什么样的数据需要使用缓存

频繁查询、难以变更的数据

4、我的Mybatis缓存

MyBatis包含非常强大的查询缓存功能,使您可以轻松地定制和配置缓存。 缓存大大提高了查询的效率。

默认情况下,MyBatis系统定义两个缓存:一级缓存和二级缓存

默认情况下,只有l1缓存处于打开状态。 (也称为SqlSession级别的缓存、本地缓存)

必须手动打开和配置l2缓存。 他基于namespace级别的缓存。

为了提高可扩展性,MyBatis定义了缓存接口Cache。 可以通过实现Cache接口来定制l2缓存

5 .一级高速缓存

一级缓存也称为本地缓存:

在与数据库相同的会话期间查询的数据将放置在本地缓存中。

如果以后需要检索相同的数据,则直接从缓存中检索,而不需要查询数据库

6、一级缓存失效4种情况

SQL会话是不同的

sqlSession相同,查询条件不同

与sqlSession一样,在查询之间执行了添加/删除操作。

与sqlSession一样,手动清除一级缓存

@Test

公共语音测试queryuserbyid

sqlsessionsession=mybatisutils.getsession (;

usermappermapper=session.get mapper (user mapper.class;

useruser=mapper.queryuserbyid (1;

system.out.println(user );

session.clearCache (; //手动清除缓存

useruser2=mapper.queryuserbyid (1;

system.out.println(user2;

system.out.println(user==user2;

session.close (;

}

这意味着一级缓存是map

7、二级缓存

l2缓存又称全局缓存,由于l1缓存的作用域太低,l2缓存应运而生

支持namespace级别的缓存、名称空间和l2缓存;

工作原理

当会话查询单个数据时,该数据将放置在当前会话的主缓存中。

如果当前会话关闭,则没有与此会话对应的一级缓存。 但是,我们想要的是会话关闭,主缓存的数据存储在辅助缓存中;

新的会话查询信息可以从l2缓存中检索内容。

不同映射器检测到的数据将放入自己的对应缓存(map )中;

使用步骤:

核心轮廓

将辅助缓存配置为在每个mapper.xml中使用非常简单。

方式1 :

方式2 :

eviction='FIFO '

flushInterval='60000 '

size='512 '

只读=' true ' /

在这种更高级的配置中,每60秒创建一次更新的FIFO缓存,最多可包含对结果对象或列表的512个引用。 此外,由于返回的对象被视为只读对象,因此更改它们可能会导致不同线程的调用方发生冲突。

八、结论

打开l2缓存后,可以通过同一映射器查询将数据检索到l2缓存中

默认情况下,检测到的数据存储在主缓存中

在提交或关闭会话之前,l1缓存中的数据不会移动到l2缓存中

原理图:

希望以上是正文的全部内容,对大家的学习有帮助。 另外,我希望你支持很多编剧。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。