本文主要介绍了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缓存中
原理图:
希望以上是正文的全部内容,对大家的学习有帮助。 另外,我希望你支持很多编剧。