springboot 多数据源配置踩坑记

63 阅读3分钟

男儿到死心如铁,看试手,补天裂。

1 前言

在日常的开发过程中,因为业务的需要会在项目中配置多个数据源,不管是业务库还是读写分析,都会在项目中配置多数据源,通常会在项目中使用 mybatis-plus 的多数据源的配置。本文将结合项目多数据源项目实践,分享遇到的 Please check the setting of primary 问题和解决方案。

2 多数据源配置

对于 mybatis-plus 多数据源的配置,首先需要添加 maven 依赖,具体如下所示,需要注意的是要保证其版本依赖关系。

-- mybatis-plus 依赖设置,需要和 mysql 驱动配合使用,不再需要配置其它
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
-- 添加多数据源配置依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.2.1</version>
</dependency>

对于多数据源的配置,可以采用 yml 配置文件的方式,也可以使用 java 代码的方式来设置,默认采用下图的 yml 方式来实现数据源的配置。那么 mybatis-plus 如何实现多数据源的切换和执行的呢,在框架中,通过数据源上线文管理器(DynamicDataSourceContextHolder)来实现多数据源 DynamicRoutingDataSource 的切换。在需要切换数据源时,需要使用 @DS 来切换数据源连接进行业务操作,需要特别注意的是,需要指定其主数据源。

1724422765377.png

3 错误排查

Please check the setting of primary, 这个错误信息指的是在配置 dynamic-datasource 时,程序没有正确配置默认的数据源 primary data source。在多数据源的场景下,通常需要设置一个默认的主数据源 primary data source,在业务代码上没有标明使用哪个数据源时,系统将使用这个主数据源。

1724339940828.png

错误原因排查:

1 检查配置文件是否遗漏了 @Primary 注解,或者在配置文件中设置主数据源,
如果在代码中配置了多个数据源,需要确保其中一个有@Primary注解。
2 检查 dynamic-datasource-spring-boot-starter 的版本和 dynamic-datasource 的版本是否一致,
需要参考官方的文档确保依赖关系的正确性,可以通过版本的变动来尝试排查问题。

通过以上的途径,依旧没有解决启动报错,辗转之余,发现了启动日志打印的信息,找到了动态数据库配置的源-DynamicRoutingDataSource,通过如下的启动日志发现了一个数据源加载信息,这个数据源的名称和配置的确实不太一样。

1724340062699.png

这个数据源在配置文件中是如下配置的,这里配置了一个数据源的 pool-name 名称:

1724340494414.png

于是,去掉该项配置 pool-name 或者将主数据源配置改为 pool-name,项目可以正确的找到主数据源,项目可以正确的加载数据库的名称,至此项目启动成功!

4 错误原因

加载数据库的配置,指定数据库的名称出现了问题,这里加载数据库的操作在代码中如下图所示:

Map<String, DataSource> dataSources = this.provider.loadDataSources()

追根溯源的找下去,AbstractDataSourceProvider 中找到了如下一段代码:如果数据库的配置制定了 pool-name, 那么数据库的 key 名称即数据库的名称,否则就是配置文件中的 key 信息,至此,终于找到了报错的根本原因。在之前的业务中,没有注意过这里的配置竟然会影响数据源的加载。

1724340109016.png

5 总结:

在本文中,通过排查多数据源加载报错为切入点,分析排查问题的思路和解决办法,通过配置文件和日志的分析,逐步深入到代码层面的文件加载,通过这种逐层深入的排查,可以更高效地发现问题的根源,并通过修改配置文件、注解或者依赖版本来解决项目启动的报错。