1. MyBatis 一级缓存与二级缓存的实现差异?
MyBatis 的一级缓存与二级缓存分别是什么?它们在实现上有何差异?
- 一级缓存的作用域(SqlSession)
- 二级缓存的作用域(namespace)
- 缓存失效与并发控制差异
MyBatis 一级缓存默认开启,作用域是 SqlSession(一个数据库会话),在同一个 SqlSession 内对相同 SQL 的查询结果会被缓存,避免重复查询;但 SqlSession 关闭或执行更新操作后缓存失效。二级缓存需要显式开启(cache 标签),作用域是 mapper 的 namespace(跨 SqlSession 共享),由多个 SqlSession 共享,需要配置 eviction(淘汰策略)、flushInterval(刷新间隔)、size、readOnly 等参数。一级缓存是 Session 级别、默认开启、无需配置;二级缓存是 namespace 级别、需显式配置、跨会话共享,存在并发与脏读风险。
一级缓存作用域小、天然安全(会话内一致);二级缓存作用域大、跨会话,需要处理并发一致性、多线程安全与序列化,因此风险更高。两级缓存默认都只能缓存查询结果,更新操作会使其失效。