MyBatis一级缓存模型

MyBatis 一级缓存的执行流程如下:
每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在LocalCache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入LocalCache,最后返回结果给用户.
流程图如下:
在这里插入图片描述

### MyBatis 一级缓存工作机制 #### 定义与作用范围 MyBatis一级缓存是指本地缓存,其作用范围仅限于 `SqlSession` 实例。这意味着当通过同一个 `SqlSession` 执行查询操作时,查询的结果会被保存在该会话的缓存中[^4]。 #### 生命周期管理 一级缓存的有效期贯穿整个 `SqlSession` 的生命周期,在此期间内保持有效;一旦 `SqlSession` 关闭或提交事务之后,缓存即被清空。因此,为了使缓存生效并减少不必要的数据库访问次数,建议在一个较短的时间窗口内重用同一 `SqlSession` 来执行相似的操作[^1]。 #### 缓存结构设计 内部采用哈希表(HashMap)形式存储数据项,其中键由查询语句及其参数构成,而对应的值则是实际获取的数据记录集合。这种映射关系使得后续相同请求可以直接命中已有条目而不必重复发起SQL指令给DBMS处理。 #### Cache接口及CacheKey定义 为了支持更复杂的场景需求,MyBatis 提供了一个抽象层——`Cache` 接口用于扩展不同的缓存策略实现类,并引入了专门的对象模型 `CacheKey` 表达唯一标识符以便精准定位所需资源位置。 ```java public interface Cache { String getId(); int getSize(); void putObject(Object key, Object value); Object getObject(Object key); boolean hasKey(Object key); void removeObject(Object key); } ``` #### 使用示例代码展示 下面给出一段简单的Java程序片段来演示如何利用MyBatis框架中的默认一级缓存功能: ```java // 创建一个新的 SqlSessionFactoryBuilder 对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = factory.openSession()) { // 获取一个可复用的 Session UserMapper mapper = session.getMapper(UserMapper.class); // 首次查询用户信息并将结果放入缓存 List<User> usersFirstTime = mapper.selectUsers(); System.out.println("第一次查询:"); for (User user : usersFirstTime) { System.out.println(user.getName()); } // 再次查询同样的数据集应该来自缓存而非数据库 List<User> usersSecondTime = mapper.selectUsers(); System.out.println("\n第二次查询(应从缓存加载):"); for (User user : usersSecondTime) { System.out.println(user.getName()); } } catch (Exception e) { throw new RuntimeException(e.getMessage(), e.getCause()); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值