Nacos适配达梦数据库
这里适配了两个版本,分别是2.2.3和2.4.1
1、官网github仓库下载源码
https://github.com/alibaba/nacos,这里以下载2.2.3源码为例。如图:
2、下载DM8驱动依赖包
https://eco.dameng.com/document/dm/zh-cn/app-dev/java-MyBatis-Plus-frame.html
3、将DM8驱动依赖包引入本地maven仓库
mvn install:install-file -Dfile=jar包的位置 -DgroupId=com.dm -DartifactId=DmJdbcDriver18 -Dversion=1.8 -Dpackaging=jar
4、nacos-all 父工程的pom文件引入
<properties>
<dm.version>1.8</dm.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>${dm.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
5、nacos-naming、nacos-common、nacos-config 子工程的pom文件引入
<dependencies>
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver18</artifactId>
</dependency>
</dependencies>
6、在nacos-plugin 工程下的nacos-datasource-plugin子工程中修改代码
constants包中的DataSourceConstant 类中增加
public static final String DM = "dm";
7、impl包中创建dm包
将mysql包中的所有类复制到dm包中,并将 ByMySql 改成 ByDm 的类名;在dm包下的所类中**getDataSource()**方法中的 DataSourceConstant.MYSQL 改成 DataSourceConstant.DM
8、修改在resource目录下 com.alibaba.nacos.plugin.datasource.mapper.Mapper 文件
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoAggrMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoBetaMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoTagMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigTagsRelationMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.HistoryConfigInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.TenantInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.TenantCapacityMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.GroupCapacityMapperByDm
将上面这些路径加入到 com.alibaba.nacos.plugin.datasource.mapper.Mapper 文件中
9、修改nacos-config配置工程中的 ExternalDataSourceProperties 类
类路径:com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties
增加 jdbcDriverName 属性
private List<String> jdbcDriverName = new ArrayList<>();
public void setJdbcDriverName(List<String> jdbcDriverName) {
this.jdbcDriverName = jdbcDriverName;
}
public List<String> getJdbcDriverName() {
return jdbcDriverName;
}
修改build方法
poolProperties.setDriverClassName(getOrDefault(jdbcDriverName, index, jdbcDriverName.get(0)).trim());
以上是naco-2.2.3版本适配达梦数据库的全过程。
注意:
以上过程在2.2.3版本中能够正常运行,但不能修改数据,发布时会提示违反唯一约束,不过,不用担心,是可以解决的;dm的唯一约束和Mysql的还是有点区别的,想要解决这个问题只需要修改 ExternalConfigInfoPersistServiceImpl 类中的 insertOrUpdate() 和 insertOrUpdateCas() 方法中的捕获异常类。将原来的捕获异常类 DuplicateKeyException 改成 DataIntegrityViolationException 类。
nacos-config——> com.alibaba.nacos.config.server.service.repository.extrnal
类路径:com.alibaba.nacos.config.server.service.repository.extrnal.ExternalConfigInfoPersistServiceImpl
10、mvn编译
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true clean install -U
以上是 2.2.3 适配的全过程,而在2.4.1的版本中有些地方不同。那么下面说一下在2.4.1有哪些不同,相同点不在详细说明。
11、2.4.1 引入依赖
同上,分别在nacos-all、nacos-config、nacos-naming、nacos-common中的pom文件引入DM8 数据库驱动依赖包。
12、2.4.1 nacos-plugin中修改代码
12.1、增加静态属性
类路径:com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant
增加:public static final String DM = “dm”;
12.2、增加枚举类ENUM
不同点1:在2.4.1中使用了枚举类
创建 dm 枚举包,复制 MySql 的枚举类 并改名为 TrustedDmFunctionEnum
12.3、在impl包创建 dm 包
不同点2:Mapper有一个基础接口类 AbstractMapperByDm
创建 dm 包后,将 mysql 包下的所有复制到 dm 包中,将 ByMySql 修改为 ByDm,将类里面的getDataSource()方法中的 DataSourceConstant.MYSQL 改成 DataSourceConstant.DM
12.4、在resource路径下的 com.alibaba.nacos.plugin.datasource.mapper.Mapper 类增加Dm的路径
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoAggrMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoBetaMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigInfoTagMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.ConfigTagsRelationMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.HistoryConfigInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.TenantInfoMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.TenantCapacityMapperByDm
com.alibaba.nacos.plugin.datasource.impl.dm.GroupCapacityMapperByDm
13、2.4.1 修改nacos-persistence工程下的代码
不同点3:在2.2.3中是没有此工程的
修改 ExternalDataSourceProperties 类型
类路径:com.alibaba.nacos.persistence.datasource.ExternalDataSourceProperties
增加类属性:
private List<String> jdbcDriverName = new ArrayList<>();
public void setJdbcDriverName(List<String> jdbcDriverName) {
this.jdbcDriverName = jdbcDriverName;
}
public List<String> getJdbcDriverName() {
return jdbcDriverName;
}
14、2.4.1 增加DM分页适配器
复制 MysqlPageHandlerAdapter 分页适配器,改名为 DmPageHandlerAdapter
15、mvn打包
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true clean install -U
16、修改配置文件
#*************** Spring Boot Related Configurations ***************#
### Default web context path: ????
server.servlet.contextPath=/nacos
### Include message field
server.error.include-message=ALWAYS
### Default web server port: ??
server.port=8848
#*************** ????? ***************#
spring.sql.init.platform=dm
db.num=1
db.url.0=jdbc:dm://127.0.0.1:5236/nacos?schema=NACOS&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
db.user.0=SYSDBA
db.password.0=xxxxx
db.pool.config.driverClassName=dm.jdbc.driver.DmDriver
db.pool.config.connectionTestQuery=SELECT 1
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#*************** ?????? ***************#
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=xxxxxxxxx
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
nacos.core.auth.server.identity.key=xxxxxxxxx
nacos.core.auth.server.identity.value=xxxxxxxxx
nacos.core.auth.config.encrypted=false
nacos.core.protocol.raft.enabled=false
nacos.core.auth.enable.userAgentAuthWhite=false
17、启动
startup.cmd -m standalone
也可以修改 startup.cmd 文件中 MODE 属性值,默认是cluster,改为standalone 单机模式