mybatisplus-dynamic-datasource多数据源失效问题

大家好,我的项目用的是mybatisplus-dynamic-datasource,主数据源是ck,还有一个是mysql,运行相安无事,但是生产环境需要用集群模式的ck,调研发现需要用ck-driver的BalancedClickhouseDataSource,需要加了个java config,如图


我数据库的数据源配置如下图

这样我发现多数据源配置失效了,查mysql的实际运行的是我的ck的,大家帮忙看看

是不是数据源bean名称的问题?

我之前用过mysql与clickhouse多数据源 不过我的clickhouse不是集群的
image

  • 配置上的clickhouse与mysql这个key其实可以自定义的
    • 比如改成DB1,DB2
  • 我猜应该是生成的数据源的bean名称 因为@DS(“mysql”)或者@DS(“DB2”) 这样就可以切换到mysql数据源了
  • 然后你自定义了clickhouse数据源的BalancedClickhouseDataSource 那么应该排除了自动装配的clickhouse数据源
    • 生成的集群数据源bean名称是方法名 balancedClickhouseDataSource
  • 但是你配置上primary的value是clickhouse 导致找不到对应的bean名称数据源, 所以就自动切换成了mysql? 你尝试把BalancedClickhouseDataSource的bean名称改成你配置上primary对应的名称看看
    @Bean(“clickhouse”) 显式指定的话 就不会默认使用方法名当做bean名称了
1 个赞

:thinking:上面回答错了.
刚花了点时间研究了下源码.自动配置类 → DynamicDataSourceAutoConfiguration类

YmlDynamicDataSourceProvider类


AbstractDataSourceProvider类 : YmlDynamicDataSourceProvider的父类

DynamicDataSourceCreator类

  • 这样分析的话, 可以尝试向spring注入一个DynamicDataSourceCreator的继承类 重写下createDataSource的方法, 解析你自己的配置 创建个集群数据源返回给mybatis-plus就好
    • (要注意优先级,应该在DynamicDataSourceProperties这个bean创建之后就可以注入了. 因为自动装配那如果有手动注入的DynamicDataSourceCreator类的话, 就不会自己注入. )
  • 切换数据源流程大概就是mybatis-plus自己维护了个map.根据注解@DS(“key”)利用key在map里面获取对应的数据源 进行AOP注入切换
  • 使用spring直接注入数据源是没被mybatis-plus维护的反而使mybatis-plus的动态数据源自动装配失效.只使用spring注入的数据源.
    在DynamicDataSourceAutoConfiguration类可以看到
1 个赞

就佩服你这种动不动就扒拉源码的选手,有理有据。硬!!!!!! :+1:

:joy:想看官方文档的…要收费29.9元… 只能连猜靠蒙的去看源码了 :rofl:

这么牛逼,我专门登录社区回复一下,谢谢大哥