说一下Mybatis的一级缓存和二级缓存
时间: 2024-09-09 16:14:48 浏览: 56
MyBatis 的缓存机制分为一级缓存(First Level Cache)和二级缓存(Second Level Cache),它们都是为了提高数据访问性能。
1. **一级缓存(Per Statement Cache)**:
也被称为查询结果缓存,它位于每个 SQL 语句执行上下文内部。每当执行一条 SQL 查询时,如果 MyBatis 没有从数据库获取到新的数据,而是找到了之前的结果,那么会直接返回给用户,而无需再次查询数据库。一级缓存在事务开始前开启,在事务结束时清空,保证了数据一致性。
2. **二级缓存(Per Mapper Cache)**:
简称 Mapper Cache 或者 Repository Cache,存在于整个 mapper 对象级别。当某个 SQL 查询第一次被执行并且数据被加载到内存后,这个数据会被存储在二级缓存中。如果后续请求相同的 mapper 和 SQL 语句,MyBatis 就可以从缓存中读取,而不是每次都去数据库。二级缓存跨线程共享,需要手动配置启用和设置最大容量,以防止内存溢出。此外,MyBatis 提供了一种叫做 `Cache` 的标签来控制是否启用二级缓存以及缓存的命中策略。
相关问题
说一下mybatis的一级缓存和二级缓存
MyBatis是一种基于Java的持久层框架,它提供了一级缓存和二级缓存两种缓存机制。
一级缓存是指在同一个SqlSession中进行多次查询时,第二次及以后的查询会直接从缓存中取出结果,而不需要再次向数据库发送SQL语句。一级缓存是MyBatis默认开启的,可以通过在mapper.xml文件中添加`<cache/>`标签来进行配置。
二级缓存是指多个SqlSession共享同一个缓存,可以跨越SqlSession的范围,同一个namespace下的所有操作共享一个二级缓存。需要注意的是,由于二级缓存是跨越SqlSession的,因此需要在多个SqlSession中共享,需要将需要进行缓存的实体类进行序列化(或者实现Serializable接口)。可以通过在mapper.xml文件中添加`<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>`标签来进行配置,其中type属性指定使用的缓存实现方式,这里使用的是Ehcache。
需要注意的是,由于缓存中存储的是从数据库中查询出来的数据,因此如果数据库中的数据发生了变化,缓存中的数据也需要更新。为了避免缓存中的数据过期,MyBatis提供了缓存清空机制,可以通过在mapper.xml文件中添加`<cache-ref namespace="namespace"/>`标签来引用其他命名空间下的缓存,并在需要清空缓存的操作中调用`clearCache()`方法来清空缓存。
说一下 mybatis 的一级缓存和二级缓存
Mybatis 的一级缓存是指在同一个 SqlSession 中执行相同的 SQL 语句时,第一次查询的结果会被缓存到内存中,后续查询相同的 SQL 语句时,会直接从缓存中获取结果,而不会再次查询数据库。一级缓存的作用范围是 SqlSession 级别的,也就是说,只有在同一个 SqlSession 中才能共享缓存。
Mybatis 的二级缓存是指在不同的 SqlSession 中执行相同的 SQL 语句时,第一次查询的结果会被缓存到内存中,后续查询相同的 SQL 语句时,会直接从缓存中获取结果,而不会再次查询数据库。二级缓存的作用范围是 Mapper 级别的,也就是说,不同的 SqlSession 可以共享同一个 Mapper 的缓存。需要注意的是,二级缓存需要手动开启和配置,而且只对查询操作有效,对于更新、插入和删除操作不会触发缓存的更新。