【dynamic-datasource】动态数据源切换失效的深度解析与解决方案
问题背景:@DS 注解为何神秘失效?
在使用 MyBatis-Plus 的 @DS
注解实现动态数据源切换时,很多开发者会遇到一个典型问题:在 Mapper 接口上添加的 @DS("slave")
注解没有生效,所有查询仍然路由到主库。这个问题尤其常见于以下场景:
// Mapper 接口声明
@DS("slave") // 期望切换到从库
public interface DataFetchMapper {List<Map> getOnlineSgpWeeks();
}// Service 调用
@Service
public class DataService {@Transactionalpublic void process() {// 实际仍使用主库!List<Map> data = dataFetchMapper.getOnlineSgpWeeks(); }
}
问题根源:事务与数据源的绑定机制
核心矛盾点
-
Spring 事务管理器的优先级高于数据源切换
- 当方法添加
@Transactional
时,Spring 会在方法开始时绑定数据源 - 这个绑定操作发生在动态数据源切换切面(
@DS
)之前
- 当方法添加
-
事务传播特性锁定数据源