baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.3k stars 4.3k forks source link

dynamic-datasource can not find primary datasource #6240

Closed lunxian8 closed 3 months ago

lunxian8 commented 3 months ago

mp3.4x升级到3.5.6 最新版本

说一下场景,我们做了jar包插件,上传后提供接口服务,里面用到了多数据源 插件开源框架:https://gitee.com/starblues/springboot-plugin-framework-parent

原来的版本呢没有问题,因为那个什么普通qw注入的问题 领导安排升级。

写法:

@SpringBootApplication
@EnableConfigurationProperties
public class XXPluginMain extends SpringPluginBootstrap {

    public static void main(String[] args) {
        new XXPluginMain().run(App.class, args);
    }

    @Override
    protected void configCoexistAllowAutoConfiguration(CoexistAllowAutoConfiguration c) {
        c.add("com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration");
        c.add("com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration");
    }

}

插件里面有个监听器:


   private void addDataSource() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        EnvironmentProvider environmentProvider = PluginContextHolder.getEnvironmentProvider();

        // 主数据源配置(从主程序获取配置参数)
        String driverClassName = environmentProvider.getString("spring.datasource.dynamic.datasource.master.driver-class-name");
        String url = environmentProvider.getString("spring.datasource.dynamic.datasource.master.url");
        String username = environmentProvider.getString("spring.datasource.dynamic.datasource.master.username");
        String password = environmentProvider.getString("spring.datasource.dynamic.datasource.master.password");

        DataSourceProperty masterSourceProperty = new DataSourceProperty();
        masterSourceProperty.setPoolName(DS_MASTER);
        masterSourceProperty.setDriverClassName(driverClassName);
        masterSourceProperty.setUrl(url);
        masterSourceProperty.setUsername(username);
        masterSourceProperty.setPassword(password);
        masterSourceProperty.setSeata(false);
        masterSourceProperty.setLazy(true);
        DataSource masterDataSource = dataSourceCreator.createDataSource(masterSourceProperty);
        ds.addDataSource(masterSourceProperty.getPoolName(), masterDataSource);

        // ERP数据源配置
        DataSourceProperty erpdbSourceProperty = new DataSourceProperty();
        erpdbSourceProperty.setPoolName(DS_ERPDB);
        erpdbSourceProperty.setDriverClassName("oracle.jdbc.OracleDriver");
        erpdbSourceProperty.setUrl("xxx");
        erpdbSourceProperty.setUsername("xx");
        erpdbSourceProperty.setPassword("xx");
        erpdbSourceProperty.setSeata(false);
        erpdbSourceProperty.setLazy(true);
        DataSource erpdbDataSource = dataSourceCreator.createDataSource(erpdbSourceProperty);
        ds.addDataSource(erpdbSourceProperty.getPoolName(), erpdbDataSource);
    }

启动完成后调用addDataSource() 一切正常,现在不行了 提示错误:dynamic-datasource can not find primary datasource 我尝试了插件yml中配置 多数据源启动无错误,但是使用的时候 抛出异常是dm数据库 好像都没走我配置的数据源 这个配置的是oracle 然后尝试用了下DynamicDataSourceContextHolder.push 方法仍然无效,中间版本太多了,想知道这块核心逻辑变更了吗?

lunxian8 commented 3 months ago

准确来说 是没走到这个插件Listener,前面直接错误了 输出:dynamic-datasource can not find primary datasource 现在是加载了多数据源引用必须配置主数据源吗?不能启动后手动add吗?

lunxian8 commented 3 months ago

主程序和插件的类加载器关系:父子关系 非隔离

lunxian8 commented 3 months ago

dynamic-database版本3.5.1 升级过最新的4.x 没用

lunxian8 commented 3 months ago

当时没测试严谨,尴尬的是mp 3.4x到3.5x中count()返回int 变成了long 大量的方法改了 不好回滚版本...

huayanYu commented 3 months ago

肯定是启动过程中调用了数据源啊, 你自己断点看看启动哪里调用了。

lunxian8 commented 3 months ago

3.4为啥可以用呀 有属性空值吗?

lunxian8 commented 3 months ago

更新后操作姿势不对已处理好,关闭