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 方法仍然无效,中间版本太多了,想知道这块核心逻辑变更了吗?
Comment From: lunxian8
准确来说 是没走到这个插件Listener,前面直接错误了 输出:dynamic-datasource can not find primary datasource 现在是加载了多数据源引用必须配置主数据源吗?不能启动后手动add吗?
Comment From: lunxian8
主程序和插件的类加载器关系:父子关系 非隔离
Comment From: lunxian8
dynamic-database版本3.5.1 升级过最新的4.x 没用
Comment From: lunxian8
当时没测试严谨,尴尬的是mp 3.4x到3.5x中count()返回int 变成了long 大量的方法改了 不好回滚版本...
Comment From: huayanYu
肯定是启动过程中调用了数据源啊, 你自己断点看看启动哪里调用了。
Comment From: lunxian8
3.4为啥可以用呀 有属性空值吗?
Comment From: lunxian8
更新后操作姿势不对已处理好,关闭