你在 MyBatis 的 @DS("wealth50") 注解中指定了数据源 wealth50,但报错却显示在查找 strategy_privatefund.actual_fund_combination_manage 表,提示表不存在。这说明实际执行 SQL 时,查到的数据库并不是你期望的 wealth50,而是 strategy_privatefund。
可能原因
- 多数据源配置未生效
@DS("wealth") 依赖于你项目中多数据源的配置(如 dynamic-datasource-spring-boot-starter)。如果配置不正确,注解不会生效,还是会走默认数据源。
- @DS注解未被正确扫描
你的 Mapper 或 Service 层没有被 Spring 正确扫描,导致 @DS 注解失效。
- Mapper方法或类上注解位置不对
@DS 可以加在类或方法上,方法上的优先级高于类上。确认你加的位置是否正确。
- 事务传播问题
如果在 Service 层有事务注解(如 @Transactional),且事务开启时用的是默认数据源,后续即使切换数据源也会失效。
排查建议
- 确认依赖和配置
- 检查 pom.xml 是否有 dynamic-datasource-spring-boot-starter 依赖。
- 检查 application.yml 或 application.properties 是否配置了 wealth50 数据源。
- 确认 @DS 注解生效
- 可以在 Mapper 类或方法上都加上 @DS("wealth50") 试试。
- 确认包扫描路径包含了你的 Mapper。
- 检查事务注解
- 如果 Service 层有 @Transactional,建议也加上 @DS("wealth50")。
- 打印SQL和数据源
- 打开 MyBatis 的 SQL 日志,确认执行 SQL 时用的是哪个数据源。
- 可以在切换数据源的地方打断点,或者打印当前数据源名。
解决办法
1. 在 Service 层加 @DS("wealth")
务必把 @DS("wealth50") 加在 Service 层(和 @Transactional 同级或更高优先级),而不是只加在 Mapper 层。
java
Apply
@Service
@DS("wealth50") // 一定要加在这里
@Transactional
public class ActualFundCombinationManageService {
// ... 你的代码 ...
}
或者加在具体方法上:
java
Apply
@Service
public class ActualFundCombinationManageService {
@DS("wealth")
@Transactional
public void yourMethod() {
// ... 你的代码 ...
}
}
2. 不要只在 Mapper 上加 @DS
只在 Mapper 上加 @DS,在有事务的情况下是无效的。
总结
- 有事务时,数据源切换要在事务开启前,即 @DS 要加在 Service 层或方法上。
- 只在 Mapper 上加 @DS,事务会用默认数据源,导致查错库。