mybatis 数据库缓存的原理

本文涉及的产品
无影云电脑个人版,1个月黄金款+200核时
资源编排,不限时长
无影云电脑企业版,4核8GB 120小时 1个月
简介: MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。

MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。

一级缓存(Local Cache)

一级缓存是指 MyBatis 默认的缓存,其作用域为 SqlSession。每当一个 SqlSession 被创建时,一个新的一级缓存也会被创建。这意味着,所有在同一个 SqlSession 中执行的查询,都会使用这个缓存。如果同一个 SqlSession 中执行了两次相同的 SQL 查询,第一次执行后的查询结果会被放在一级缓存中,第二次查询就会直接从缓存中获取结果,不需要再去查询数据库。

一级缓存的生命周期与 SqlSession 的生命周期相同,当 SqlSession 被关闭时,其对应的一级缓存也就消失了。

需要注意的是,如果在两次相同查询之间执行了增删改操作(这些操作可能会改变数据),MyBatis 会清空缓存,以确保缓存中存储的是最新的数据。

二级缓存(Global Cache)

与一级缓存不同,二级缓存的作用域不是 SqlSession 而是 Mapper 的命名空间。这意味着,来自不同 SqlSession 的相同命名空间的相同查询可以共享缓存数据。

二级缓存需要进行显式的配置才能使用。在 MyBatis 配置文件中开启二级缓存,并在需要使用二级缓存的 Mapper 文件中添加相应配置。开启后,查询结果会被缓存,并且在多个 SqlSession 间共享。

二级缓存比一级缓存拥有更广的作用范围,但也因此涉及更多的管理和维护工作,比如处理缓存同步的问题。为确保数据的一致性,当有增删改操作时,MyBatis 会清空受影响的二级缓存区域。

缓存的原理简述

  1. 查询过程:当执行查询时,MyBatis 首先查找一级缓存,如果没有找到,再去查找二级缓存;如果两级缓存都没有命中,才会执行 SQL 查询数据库。
  2. 更新过程:当执行增删改操作时,为维护数据的一致性,MyBatis 会清空一级缓存和受影响的二级缓存。

通过以上机制,MyBatis 的缓存能够有效地减少数据库的访问次数,从而提高应用的性能。然而,需要合理地配置和使用缓存,避免因缓存数据过期或不一致而引发的问题。


在实际项目中使用 MyBatis 二级缓存时,需要通过一些配置和步骤来开启和使用。以下是使用 MyBatis 二级缓存的一般步骤:

步骤 1:依赖引入

确保你的项目中引入了 MyBatis 和对应的缓存实现库。如果使用的是 Maven,可以在 pom.xml 中添加如下依赖(版本号仅供参考,使用时请选用适当的版本):

xml复制代码

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

<!-- 使用EhCache作为二级缓存实现 -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.0</version>
</dependency>

步骤 2:MyBatis 配置文件中开启二级缓存

在 MyBatis 的全局配置文件(mybatis-config.xml)中添加二级缓存的配置。需要设置 cacheEnabled 属性为 true,这个属性默认为 true,但最好在配置文件中明确指出。

xml复制代码

<configuration>
    <settings>
        <!-- 开启全局二级缓存,默认为true -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

步骤 3:在 Mapper.xml 中配置二级缓存

在你希望启用二级缓存的 Mapper.xml 文件中添加 <cache> 标签。例如:

xml复制代码

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 开启这个Mapper的二级缓存 -->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
    
    <!-- Mapper接口方法的定义 -->
</mapper>
  • eviction:缓存的回收策略,如 LRU(最近最少使用的)、FIFO(先进先出)等。
  • flushInterval:缓存刷新间隔,单位毫秒。
  • size:引用数目,缓存中对象的最大数量。
  • readOnly:是否只读。只读缓存会给所有调用者返回缓存对象的相同实例,因此它们不应该修改这些对象。

步骤 4:实体类序列化

由于二级缓存数据需要在不同的会话之间共享,MyBatis 会将缓存数据序列化后存储。因此,对应的实体类需要实现 java.io.Serializable 接口:

java复制代码

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    // 类的属性和方法
}

注意事项

  1. 二级缓存的使用场合:二级缓存适用于读多写少的情况,如果业务场景中数据频繁变动,可能导致缓存频繁失效,反而降低性能。
  2. 数据一致性:在使用二级缓存时,应注意缓存数据的一致性问题。在进行数据更新操作后,需要合理地清理相关缓存,避免出现脏读。
  3. 缓存策略的选择:可以根据实际需求选择合适的缓存回收策略和缓存配置。

通过以上步骤和注意事项,可以在实际项目中有效地配置和使用 MyBatis 的二级缓存,从而提高应用的性能。

相关文章
|
3天前
|
缓存 NoSQL Serverless
云数据库Tair:从稳定低延时缓存到 Serverless KV
本次分享聚焦云数据库Tair的使用,涵盖三部分内容:1) Tair概览,介绍其作为稳定低延时缓存及KV数据库服务的特点和优势;2) 稳定低延迟缓存技术,探讨如何通过多线程处理、优化内核等手段提升性能与稳定性;3) 从缓存到Serverless KV的演进,特别是在AI大模型时代,Tair如何助力在线服务和推理缓存加速。Tair在兼容性、性能优化、扩缩容及AI推理加速方面表现出色,满足不同场景需求。
|
1月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
246 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
1月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
24天前
|
缓存 物联网 数据库
InfluxDB vs TDengine :2025 年了,谁家用的数据库还不能高效读缓存?
在工业互联网和物联网的大数据应用场景中,实时数据的写入和查询性能至关重要。如何快速获取最新设备状态并实时处理数据,直接影响到业务的高效运转。本文将深入分析 TDengine 和 InfluxDB 在缓存机制上的差异,帮助读者更好地理解这两款主流时序数据库在性能优化方面的优劣。
52 1
|
24天前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
31 1
|
28天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
45 4
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
1月前
|
存储 缓存 网络安全
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
36 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
1月前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!