二级缓存虽然能提高应用效率,减轻数据库服务器的压力,但是如果使用不当,很容易产生脏数据。这些脏数据会在不知不觉中影响业务逻辑,影响应用的实效,所以我们需要了解在MyBatis缓存中脏数据是如何产生的。也要掌握避免脏数据的技巧。
Mybatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存,不同mapper的二级缓存互不影响。在常见的数据库操作中,多表联合查询非常常见,由于关系型数据库的设计,使得很多时候需要关联多个表才能获得想要的数据。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中,这样一个多表的查询就会缓存在该命名空间的二级缓存中。涉及这些表的增、删、改操作通常不在一个映射文件中,它们的命名空间不同,因此当有数据变化时,多表查询的缓存未必会被清空,这种情况下就会产生脏数据。
该如何避免脏数据的出现呢?这时就需要用到参照缓存了。当某几个表可以作为一个业务整体时,通常是让几个会关联的ER表同时使用同一个二级缓存,这样就能解决脏数据问题。
例如:
<mapper namespace="tk.mybatis.simple.mapper.UserMapper">
<cache-ref namespace="tk.mybatis.simple.mapper.RoleMapper"/>
</mapper>
二级缓存适用场景
二级缓存虽然好处很多,但是并不是什么时候都可以使用。在以下场景中,推荐使用二级缓存。
以查询为主的应用,只有尽可能少的增、删、改操作。
绝大多数以单表操作存在时,由于很少存在相互关联的情况,因此不会出现脏数据。
可以按业务划分对表进行分组时,如关联的表比较少,可以通过参照缓存进行配置