MyBatis 的二级缓存不能跨 namespace。在 MyBatis 中,二级缓存是基于 namespace(即 Mapper 文件)进行隔离的。每一个 Mapper 对应一个独立的缓存区域,缓存数据只能在这个 namespace 内共享,无法跨越到其他 namespace 进行数据共享。这是因为每个 namespace 代表不同的 SQL 映射文件,它们可能操作不同的数据库表或者有不同的查询逻辑,所以为确保数据一致性,缓存是严格与 Mapper 对应的。
理由:
- 数据隔离:每个 namespace 通常对应一个特定的实体或表,跨 namespace 可能会导致不同表的数据混淆,无法保证数据的一致性和正确性。
- 缓存作用域:二级缓存的作用域限定在一个 Mapper 的范围内,不会影响其他 Mapper 中的数据。这种设计能够避免不同 Mapper 的缓存相互污染。
如果需要跨 namespace 共享数据:
虽然 MyBatis 不支持直接跨 namespace 共享二级缓存,但可以通过一些其他手段来实现类似效果,比如使用外部的分布式缓存系统(如 Redis 或 Memcached)来实现跨 namespace 的数据缓存和共享。
代码配置示例:
在每个需要二级缓存的 Mapper 中启用缓存:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
</mapper>
<mapper namespace="com.example.mapper.OrderMapper">
<cache/>
</mapper>
这两个 Mapper 的缓存是相互独立的,无法跨越彼此共享数据。
总的来说,MyBatis 的二级缓存设计基于 namespace 隔离,提供了模块化的缓存管理,确保数据一致性和安全性。