错误总结:
(springboot版本:2.3.4)
- 引入了dynamic-datasource-spring-boot-starter包,没有写application配置会报该错
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
- application配置没有声明 primary默认值会报该错
- application声明 primary默认值不正确会报该错
- 某些依赖冲突 网上说druid会有冲突 需要排除启动,类似的可能有其它依赖冲突,要排查的话建议另写一个demo 一 一排除 ,类似的可能会有jar包版本问题
- 当前项目packing 为pom 会报该错,因为我的是maven复合工程 另起重构工程时 把其中一个pom复制出来 忘记改了 报错导致思维误导,没想到是打包问题 排查了很久才发现的
获取datasource:
通常我们@DS 声明就可以了,但是当我们使用到第三方组件 需要设置一个datasource 该怎么获取呢?
场景:配置定时器分布锁
/**
* 定时分布锁配置
* 此时的 @Ds("db2") 是失效的
*/
@Configuration
@EnableScheduling
public class ScheduledTaskConfig {
@Autowired
private DataSource dataSource;
@Bean
public LockProvider lockProvider() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
DataSource db2 = ds.getDataSource("db2");
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(db2))
//.withTimeZone(TimeZone.getTimeZone("UTC"))
.withTableName("sys_schedule_lock")
.build()
);
}
}
查看一下源码即可发现 DynamicRoutingDataSource 是继承自 DataSource 的,
多个dataSource保存在 dataSourceMap 中,
自然在DynamicRoutingDataSource类中,提供了dataSource.getDataSource(" ")的方法来获取
所以我们需要手动转型一下