MyBatis 缓存机制导致查询不到数据,可以尝试清除缓存或者关闭缓存功能。 如何清理
时间: 2024-05-07 16:23:33 浏览: 116
MyBatis 的缓存分为一级缓存和二级缓存,清理缓存的方法也略有不同。
1. 清理一级缓存
MyBatis 的一级缓存是 session 级别的缓存,只在同一个 session 中有效。可以通过调用 session 的 clearCache() 方法来清空一级缓存。例如:
```
SqlSession session = sqlSessionFactory.openSession();
try {
// do something
} finally {
session.clearCache(); // 清理缓存
session.close();
}
```
2. 清理二级缓存
MyBatis 的二级缓存是 mapper 级别的缓存,可以在多个 session 中共享。可以通过在配置文件中设置 `<cache/>` 标签的 `eviction` 属性来控制二级缓存的清理策略。例如:
```
<cache eviction="LRU" flushInterval="60000" size="512"/>
```
其中,eviction 属性指定清理策略,常用的有 LRU(最近最少使用)、FIFO(先进先出)和 SOFT(基于内存敏感度的垃圾回收机制)。flushInterval 属性表示刷新间隔时间,单位为毫秒,默认值为 -1 表示不刷新。size 属性表示缓存大小,单位为条目。
除了配置文件设置以外,还可以通过调用 mapper 的 flushCache() 方法来清空二级缓存。例如:
```
SqlSession session = sqlSessionFactory.openSession();
try {
Mapper mapper = session.getMapper(MyMapper.class);
// do something
mapper.flushCache(); // 清理缓存
} finally {
session.close();
}
```
需要注意的是,清理缓存可能会影响性能,需要根据具体情况进行权衡。如果缓存导致查询不到数据的问题比较严重,可以考虑关闭缓存功能。可以在配置文件中设置 `<select/>` 标签的 `useCache` 属性为 false 来关闭缓存。例如:
```
<select id="selectById" resultType="User" parameterType="int" useCache="false">
select * from user where id = #{id}
</select>
```
阅读全文