在 Java + MyBatis 中,缓存主要分为 一级缓存 和 二级缓存,下面用通俗的方式讲清楚原理和用法。
SqlSession 内,执行相同的 SQL + 参数,会直接走缓存SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User u1 = mapper.selectById(1); // 查数据库
User u2 = mapper.selectById(1); // 走一级缓存
一级缓存会在以下情况清空:
insert / update / deletesession.clearCache()SqlSession✅ 一级缓存无法关闭(只能避免)
SqlSession 可共享<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<mapper namespace="com.xxx.mapper.UserMapper">
<cache/>
</mapper>
或注解方式(MyBatis 3.4+ 支持有限):
@CacheNamespace
public interface UserMapper {
}
public class User implements Serializable {
}
SqlSession s1 = factory.openSession();
UserMapper m1 = s1.getMapper(UserMapper.class);
m1.selectById(1); // 查库
s1.close();
SqlSession s2 = factory.openSession();
UserMapper m2 = s2.getMapper(UserMapper.class);
m2.selectById(1); // 走二级缓存
<cache
eviction="LRU"
flushInterval="60000"
size="512"
readOnly="true"/>
含义:
eviction:回收策略(LRU / FIFO)flushInterval:刷新时间(毫秒)size:缓存对象数量readOnly:是否只读✅ MyBatis 缓存 ≠ 业务缓存
实际项目常用:
@Cacheable)@Cacheable("user")
public User getUserById(Integer id) {
return userMapper.selectById(id);
}
| 缓存 | 级别 | 是否默认 | 使用场景 |
|---|---|---|---|
| 一级缓存 | SqlSession | ✅ | 单次请求内部 |
| 二级缓存 | Mapper | ❌ | 单应用读多写少 |
| Redis | 应用级 | ❌ | 分布式、生产推荐 |
如果你用的是 Spring Boot / MyBatis-Plus / Redis 整合缓存,我可以给你具体代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。