解决Nacos使用达梦数据库报错问题(包括Nacos源码编译运行)

nacos使用达梦数据库更新配置时报错问题解决

  • 有两个方案
  1. 配置数据库插件
  2. 修改源码

这篇文章主要介绍第二种,因为第一种没研究明白🐶

报错信息

caused: PreparedStatementCallback;
违反表[CONFIG_INFO]唯一性约束条件[UK_CONFIGINFO_DATAGROUPTENANT];
nested exception is dm.jdbc.driver.DMException:
违反表[CONFIG_INFO]唯一性约束条件[UK_CONFIGINFO_DATAGROUPTENANT];
caused: 违反表[CONFIG_INFO]唯一性约束条件[UK_CONFIGINFO_DATAGROUPTENANT];

方案一

方案一(未实现)
  • 简单说一下方案一

官方也提供了数据库插件的实现接口,下面是一个达梦数据库的实现插件

但是没研究明白怎么用,后期慢慢研究🤔

方案二

  • 这篇文章主要是用nacos-2.2.2 为例子,如果你使用的nacos配置完达梦数据库也报错,那你可以尝试修改一下,问题应该是一样的

1.下载nacos源码

2.运行源码

  • 下载依赖
    这个就不用说了,配置一个国内的maven仓库地址,然后就是漫长的等待,等所有的依赖下载完
1
2
3
4
5
6
7
<!--放一个阿里云的maven仓库地址-->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

3.编译

有一些文件类是需要编译才能生成的,所以先不要着急运行,打开idea的maven菜单,运行compile ,会在target目录下生成所需的类文件

看到这个说明你编译成功了
成功日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[INFO] Alibaba NACOS 2.2.2 ................................ SUCCESS [  1.193 s]
[INFO] nacos-api 2.2.2 .................................... SUCCESS [ 3.550 s]
[INFO] nacos-common 2.2.2 ................................. SUCCESS [ 3.564 s]
[INFO] nacos-consistency 2.2.2 ............................ SUCCESS [ 6.453 s]
[INFO] nacos-plugin 2.2.2 ................................. SUCCESS [ 0.037 s]
[INFO] nacos-auth-plugin 2.2.2 ............................ SUCCESS [ 0.436 s]
[INFO] nacos-custom-environment-plugin 2.2.2 .............. SUCCESS [ 0.336 s]
[INFO] nacos-sys 2.2.2 .................................... SUCCESS [ 0.824 s]
[INFO] nacos-auth 2.2.2 ................................... SUCCESS [ 0.751 s]
[INFO] nacos-trace-plugin 2.2.2 ........................... SUCCESS [ 0.324 s]
[INFO] nacos-control-plugin 2.2.2 ......................... SUCCESS [ 0.684 s]
[INFO] nacos-core 2.2.2 ................................... SUCCESS [ 3.467 s]
[INFO] nacos-encryption-plugin 2.2.2 ...................... SUCCESS [ 0.347 s]
[INFO] nacos-datasource-plugin 2.2.2 ...................... SUCCESS [ 0.645 s]
[INFO] nacos-config 2.2.2 ................................. SUCCESS [ 4.616 s]
[INFO] nacos-cmdb 2.2.2 ................................... SUCCESS [ 0.873 s]
[INFO] nacos-naming 2.2.2 ................................. SUCCESS [ 4.033 s]
[INFO] nacos-address 2.2.2 ................................ SUCCESS [ 1.025 s]
[INFO] nacos-client 2.2.2 ................................. SUCCESS [ 2.302 s]
[INFO] nacos-plugin-default-impl 2.2.2 .................... SUCCESS [ 1.639 s]
[INFO] nacos-istio 2.2.2 .................................. SUCCESS [ 8.247 s]
[INFO] nacos-prometheus 2.2.2 ............................. SUCCESS [ 0.965 s]
[INFO] nacos-console 2.2.2 ................................ SUCCESS [ 1.905 s]
[INFO] nacos-test 2.2.2 ................................... SUCCESS [ 0.093 s]
[INFO] nacos-config-test 2.2.2 ............................ SUCCESS [ 0.102 s]
[INFO] nacos-naming-test 2.2.2 ............................ SUCCESS [ 0.112 s]
[INFO] nacos-core-test 2.2.2 .............................. SUCCESS [ 0.134 s]
[INFO] nacos-example 2.2.2 ................................ SUCCESS [ 0.738 s]
[INFO] nacos-distribution 2.2.2 ........................... SUCCESS [ 0.099 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 49.896 s
[INFO] Finished at: 2024-07-02T21:35:51+08:00
[INFO] ------------------------------------------------------------------------

4.运行

如果运行还提示以下类找不到,那就刷新一下依赖信息

1
2
3
import com.alibaba.nacos.consistency.entity.ReadRequest;
import com.alibaba.nacos.consistency.entity.Response;
import com.alibaba.nacos.consistency.entity.WriteRequest;

打开console 模块,运行里面的main 方法

运行之前需要配置一个vm启动参数-Dnacos.standalone=true ,因为nacos默认是集群 方式启动,所以我们要指定单机 模式启动

如果运行没问题的话,打开这个地址你可以看到nacos的界面

到这里你已经成功一半了U0001fae1

5.修改源码

全局搜索ExternalConfigInfoPersistServiceImpl类,包名是这个

com.alibaba.nacos.config.server.service.repository.extrnal.ExternalConfigInfoPersistServiceImpl

找到一下两段代码177行194行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void insertOrUpdate(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,
Map<String, Object> configAdvanceInfo, boolean notify) {
try {
addConfigInfo(srcIp, srcUser, configInfo, time, configAdvanceInfo, notify);
} catch (DuplicateKeyException ive) { // Unique constraint conflict
updateConfigInfo(configInfo, srcIp, srcUser, time, configAdvanceInfo, notify);
}
}

@Override
public boolean insertOrUpdateCas(String srcIp, String srcUser, ConfigInfo configInfo, Timestamp time,
Map<String, Object> configAdvanceInfo, boolean notify) {
try {
addConfigInfo(srcIp, srcUser, configInfo, time, configAdvanceInfo, notify);
return true;
} catch (DuplicateKeyException ignore) { // Unique constraint conflict
return updateConfigInfoCas(configInfo, srcIp, srcUser, time, configAdvanceInfo, notify);
}
}

把catch捕获的异常修改成DataIntegrityViolationException

解释
因为mysql和达梦的驱动实现不一样,所以在插入一条已经存在的数据时,抛出的异常也不一样,所以导致了连接达梦数据库无法更新配置的问题

这里其实我也没理解为什么要通过异常捕获的方式来判断执行更新还是插入,可能是因为这样可以少执行一次查询吧

6.引入依赖

找到config模块对应的pom文件,加入达梦的驱动依赖

1
2
3
4
5
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>版本号</version>
</dependency>

7.修改配置文件

打开打开console 模块的配置文件,加入以下配置

1
2
3
4
5
6
7
8
9
#这个配置加不加无所谓,不影响结果
spring.sql.init.platform=dameng

db.num=1
db.url.0=jdbc:dm://localhost:5236
db.user.0=nacos
db.password.0=nacos
# 这里写你达梦驱动类
db.pool.config.driver-class-name=dm.jdbc.driver.DmDriver

到这里正常情况下,你已经完成了90%,打开本地的nacos页面,报错的问题应该已经解决了

8.打包

1
2
3
4
# powershell执行
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
# cmd执行
mvn -Prelease-nacos -DskipTests clean install -U

上面两个命令根据窗口类型选择一个来执行,正常情况会在distribution 模块下生成nacos-server.jar ,然后就可以放到你的服务器运行啦🤫

成功日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[INFO] Copying files to D:\app\java-project\nacos\nacos-2.2.2\distribution\target\nacos-server-2.2.2
[INFO] Building tar: D:\app\java-project\nacos\nacos-2.2.2\distribution\target\nacos-server-2.2.2.tar.gz
[INFO] Building zip: D:\app\java-project\nacos\nacos-2.2.2\distribution\target\nacos-server-2.2.2.zip
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Alibaba NACOS 2.2.2 2.2.2:
[INFO]
[INFO] Alibaba NACOS 2.2.2 ................................ SUCCESS [ 3.360 s]
[INFO] nacos-api 2.2.2 .................................... SUCCESS [ 8.593 s]
[INFO] nacos-common 2.2.2 ................................. SUCCESS [ 7.564 s]
[INFO] nacos-consistency 2.2.2 ............................ SUCCESS [ 4.365 s]
[INFO] nacos-plugin 2.2.2 ................................. SUCCESS [ 0.146 s]
[INFO] nacos-auth-plugin 2.2.2 ............................ SUCCESS [ 0.745 s]
[INFO] nacos-custom-environment-plugin 2.2.2 .............. SUCCESS [ 0.550 s]
[INFO] nacos-sys 2.2.2 .................................... SUCCESS [ 1.225 s]
[INFO] nacos-auth 2.2.2 ................................... SUCCESS [ 1.134 s]
[INFO] nacos-trace-plugin 2.2.2 ........................... SUCCESS [ 0.434 s]
[INFO] nacos-control-plugin 2.2.2 ......................... SUCCESS [ 1.350 s]
[INFO] nacos-core 2.2.2 ................................... SUCCESS [ 5.630 s]
[INFO] nacos-encryption-plugin 2.2.2 ...................... SUCCESS [ 0.459 s]
[INFO] nacos-datasource-plugin 2.2.2 ...................... SUCCESS [ 0.986 s]
[INFO] nacos-config 2.2.2 ................................. SUCCESS [ 8.554 s]
[INFO] nacos-cmdb 2.2.2 ................................... SUCCESS [ 0.856 s]
[INFO] nacos-naming 2.2.2 ................................. SUCCESS [ 7.299 s]
[INFO] nacos-address 2.2.2 ................................ SUCCESS [ 0.953 s]
[INFO] nacos-client 2.2.2 ................................. SUCCESS [ 15.355 s]
[INFO] nacos-plugin-default-impl 2.2.2 .................... SUCCESS [ 2.429 s]
[INFO] nacos-istio 2.2.2 .................................. SUCCESS [ 10.301 s]
[INFO] nacos-prometheus 2.2.2 ............................. SUCCESS [ 0.812 s]
[INFO] nacos-console 2.2.2 ................................ SUCCESS [ 3.007 s]
[INFO] nacos-test 2.2.2 ................................... SUCCESS [ 0.209 s]
[INFO] nacos-config-test 2.2.2 ............................ SUCCESS [ 0.260 s]
[INFO] nacos-naming-test 2.2.2 ............................ SUCCESS [ 0.238 s]
[INFO] nacos-core-test 2.2.2 .............................. SUCCESS [ 0.226 s]
[INFO] nacos-example 2.2.2 ................................ SUCCESS [ 0.638 s]
[INFO] nacos-distribution 2.2.2 ........................... SUCCESS [ 10.374 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:38 min
[INFO] Finished at: 2024-07-03T19:48:30+08:00
[INFO] ------------------------------------------------------------------------

如果执行命令之后没有生成对应的jar,检查 idea 项目结构 ->SDK和语言级别 是否对应
实测JDK11和JDK17都没有问题,可以打包成功,但是必须两个配置对应上才行