目录
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
4472

被折叠的 条评论
为什么被折叠?



