注册个免费网站,.课程网站建设与应用,软件 网站开发合作协议,北京市网站制作公司大家好#xff0c;我是锋哥。今天分享关于【MyBatis一二级缓存的区别#xff1f;】面试题。希望对大家有帮助#xff1b; MyBatis一二级缓存的区别#xff1f;
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
MyBatis 的缓存机制分为 一级缓存 和 二级缓存…大家好我是锋哥。今天分享关于【MyBatis一二级缓存的区别】面试题。希望对大家有帮助 MyBatis一二级缓存的区别
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
MyBatis 的缓存机制分为 一级缓存 和 二级缓存它们在作用范围和存储位置等方面有一些显著的区别。以下是它们的详细区别
1. 一级缓存Local Cache 作用范围一级缓存是与 SqlSession 绑定的缓存。每次创建 SqlSession 时都会为该 SqlSession 分配一个一级缓存生命周期仅限于该 SqlSession。也就是说只要 SqlSession 没有关闭缓存的数据就会存在一旦 SqlSession 关闭缓存数据就会丢失。 存储位置一级缓存存储在 SqlSession 内部是本地缓存。 工作方式如果在同一个 SqlSession 中多次查询相同的数据MyBatis 会先从一级缓存中查找数据如果缓存中有数据就直接返回而不会执行数据库查询。如果缓存中没有数据才会执行 SQL 查询并将结果缓存到一级缓存中。 清空机制一级缓存会在以下情况下被清空 执行了 commit() 或 rollback()。SqlSession 被关闭。手动调用 clearCache() 清空缓存。 优点由于一级缓存与 SqlSession 绑定它的数据访问速度非常快且不会产生额外的存储消耗。 缺点只能在同一个 SqlSession 内共享缓存因此不适用于跨 SqlSession 的缓存共享。
2. 二级缓存Global Cache 作用范围二级缓存是与 SqlSessionFactory 绑定的缓存。也就是说二级缓存可以跨多个 SqlSession 共享整个应用程序可以共享二级缓存中的数据。它的生命周期与 SqlSessionFactory 关联只要 SqlSessionFactory 存在二级缓存就会存在。 存储位置二级缓存通常存储在内存中但它也可以配置为使用外部缓存如 Redis、Ehcache 等。 工作方式二级缓存是在多个 SqlSession 之间共享的。当在一个 SqlSession 执行查询时MyBatis 会先查询一级缓存如果没有找到再查询二级缓存。如果二级缓存也没有找到数据才会执行数据库查询并将查询结果存储到二级缓存中供其他 SqlSession 共享。 清空机制二级缓存的清空机制比较复杂通常在以下情况下会清空 数据库表中的数据发生变化时执行了增删改操作。SqlSessionFactory 重新加载或刷新时。手动调用 clearCache() 清空缓存。 优点由于二级缓存可以跨多个 SqlSession 共享因此可以大大提高跨会话的数据读取效率减少数据库的访问压力。 缺点二级缓存的存储和清空机制更加复杂需要进行配置并且可能会引入一些同步问题例如数据一致性问题。
3. 一级缓存和二级缓存的关系 级别差异一级缓存是局部缓存只作用于当前 SqlSession而二级缓存是全局缓存作用于整个 SqlSessionFactory。 缓存命中顺序MyBatis 的缓存机制是按照优先级顺序访问的即查询数据时首先会查询一级缓存如果一级缓存没有再查询二级缓存。如果二级缓存也没有才会进行数据库查询。 缓存一致性一级缓存是由 SqlSession 管理的不会跨 SqlSession因此不存在一致性问题。而二级缓存是跨 SqlSession 的共享缓存在分布式或多线程环境下需要特别小心缓存一致性问题可能需要引入外部缓存框架来处理。
4. 配置二级缓存
二级缓存需要通过配置文件显式开启并配置。在 MyBatis 的 XML 配置文件中你需要做以下几步 开启二级缓存 在 mybatis-config.xml 文件中设置 setting namecacheEnabled valuetrue/。 在 Mapper 文件中启用缓存 每个 Mapper 文件中的 mapper 元素需要添加 cache/ 元素来启用二级缓存。 mapper namespacecom.example.mapper.UserMappercache/!-- 其他映射语句 --
/mapper配置缓存的实现类 可以选择默认的缓存实现如 PerpetualCache也可以使用外部的缓存库如 Ehcache。 settingssetting namecacheImplementation valueorg.mybatis.caches.ehcache.EhcacheCache/
/settings缓存的清理策略 你可以使用 flushCache 属性来控制缓存清理策略。
总结
一级缓存是基于 SqlSession 的局部缓存生命周期短性能高但不能跨会话共享数据。二级缓存是基于 SqlSessionFactory 的全局缓存跨多个 SqlSession 共享数据适合于跨会话的数据复用但需要配置和管理。
通过合理地配置和使用一级缓存和二级缓存可以有效地提升 MyBatis 的性能减少不必要的数据库查询操作。