使用Jeecg-cloud-nacos 3.8.2 连接达梦数据库踩坑

目录
1、问题描述
2、产生原因
3、修改方案

问题描述

从官方下载好的JeecgBoot代码,根据官方文档使用微服务模式启动时,jeecg-cloud-nacos 连接达梦数据库。配置完成后启动,总是报错,原因是mysql的数据库驱动使用了达梦的连接字串。这就很奇怪按照官方给的dm配置配置的,为什么会这样。

产生原因

通过查看源码发现

com.alibaba.nacos.persistence.datasource包下面的
ExternalDataSourceProperties类
方法

List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
    List<HikariDataSource> dataSources = new ArrayList();
    Binder.get(environment).bind("db", Bindable.ofInstance(this));
    Preconditions.checkArgument(Objects.nonNull(this.num), "db.num is null");
    Preconditions.checkArgument(CollectionUtils.isNotEmpty(this.user), "db.user or db.user.[index] is null");
    Preconditions.checkArgument(CollectionUtils.isNotEmpty(this.password), "db.password or db.password.[index] is null");

    for(int index = 0; index < this.num; ++index) {
        int currentSize = index + 1;
        Preconditions.checkArgument(this.url.size() >= currentSize, "db.url.%s is null", new Object[]{index});
        DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);
        if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {
            poolProperties.setDriverClassName("com.mysql.cj.jdbc.Driver");
        }

        poolProperties.setJdbcUrl(((String)this.url.get(index)).trim());
        poolProperties.setUsername(((String)CollectionUtils.getOrDefault(this.user, index, this.user.get(0))).trim());
        poolProperties.setPassword(((String)CollectionUtils.getOrDefault(this.password, index, this.password.get(0))).trim());
        HikariDataSource ds = poolProperties.getDataSource();
        if (StringUtils.isEmpty(ds.getConnectionTestQuery())) {
            ds.setConnectionTestQuery("SELECT 1");
        }

        dataSources.add(ds);
        callback.accept(ds);
    }

上面这段代码中

    if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {
        poolProperties.setDriverClassName("com.mysql.cj.jdbc.Driver");
    }

把无法正确取到配置项的问题屏蔽了。
而且数据源是使用的 HikariConfig 的配置。

解决方案

知道了问题所在就有了解决方案。下面给出两种解决方案。

第一种:生写 ExternalDataSourceProperties 类

把这个类复制出来,在自己的项目里面同样的包下面创建一个,然后把

            if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {
                poolProperties.setDriverClassName("com.mysql.cj.jdbc.Driver");
            }
        代码中的驱动换成达梦的即可

第二种:配置文件中配置 HikariConfig

官司方给出的配置如下:

db:
  pool: 
    config:
      driverClassName: dm.jdbc.driver.DmDriver
  num: 1
  password:
    '0': SYSDBA
  url:
    '0': jdbc:dm://192.168.1.188:30236/DMSERVER?schema=NACOS&compatibleMode=mysql&ignoreCase=true&ENCODING=utf-8
  user:
    '0': SYSDBA

如果未认真看官方给的配置,而是从Ai,或是其他地方搜索来的配置,很有可能是如下这个样子的

db:
  driverClassName: dm.jdbc.driver.DmDriver
  num: 1
  password:
    '0': SYSDBA
  url:
    '0': jdbc:dm://192.168.1.188:30236/DMSERVER?schema=NACOS&compatibleMode=mysql&ignoreCase=true&ENCODING=utf-8
  user:
    '0': SYSDBA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值