目录

1. 概要

版本

2. 具体解决方案细节

2.1 ExternalDataSourceProperties.java源码修改

2.2 plugin模块改造

2.2.1 DataSourceConstant.java

2.2.2 增加PrimaryKeyConstant.java类

2.2.3 新增对dialect的管理

2.2.3.1 新增DatabaseDialectManager类

2.2.3.2 新增package:com.alibaba.nacos.plugin.datasource.dialect

1. 新增接口 DatabaseDialect

2. 新增抽象类 AbstractDatabaseDialect

3. 新增默认实现类 DefaultDatabaseDialect

2.2.4 抽象BaseMapper

新增BaseConfigInfoAggrMapper

新增BaseConfigInfoBetaMapper

新增BaseConfigInfoMapper

新增BaseConfigInfoTagMapper

新增BaseConfigTagsRelationMapper

新增BaseGroupCapacityMapper

新增BaseTenantCapacityMapper

新增BaseTenantInfoMapper

2.2.5 达梦dm适配

1. 新增达梦的dialect实现以及Mapper

2. 支持达梦数据库错误码

3. 增加SPI加载

4. 达梦jdbc配置

5. dm脚本

6. 打包、指定加载依赖运行

2.2.6 kingbase8适配

1. 新增kingbase的dialect实现以及Mapper

2. 增加SPI加载

3. kingbase8 jdbc配置

4. kingbase8脚本

5. 打包、指定加载依赖运行

2.2.7 其他数据库的适配

1.脚本的适配

2.创建对应的Dialect以及mapper

3.配置SPI

4.修改datasource配置

5.jdbc驱动问题

6.打包运行


1. 概要

主要是为了信创,需要各种开源组件以及自身开发的产品对国产环境进行验证,其中最重要的一环就是国产数据库的适配,在借鉴了各位大佬的文章以及查阅了无数国产数据库官方文档之后,最后整理出了一版兼容以上数据库的案例,本人已经测试过了,完美运行。整理不易,望诸君高台贵手,点赞支持。

版本

nacos:2.2.3 

nacos源码下载什么的在这里就不做赘述了,直接github下载的,数据库版本也没多大限制,只要能跑脚本的一般都没啥问题

2. 具体解决方案细节

2.1 ExternalDataSourceProperties.java源码修改

修改这里主要是为了能自定义在配置文件里面配置driverClassName、testQuery等等自定义配置,反正都是源码修改,不在乎修改多少,这里一改,其他地方就能直接配置使用了,主打的就是省心,可直接复制下面代码覆盖源码,源码:com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties。

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

package com.alibaba.nacos.config.server.service.datasource;

import com.alibaba.nacos.common.utils.Preconditions;
import com.alibaba.nacos.common.utils.StringUtils;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.core.env.Environment;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault;

/**
 * Properties of external DataSource.
 *
 * @author Nacos
 */
public class ExternalDataSourceProperties {
    
    private static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
    
    private static final String TEST_QUERY = "SELECT 1";
    
    private Integer num;
    
    private List<String> url = new ArrayList<>();
    
    private List<String> user = new ArrayList<>();
    
    private List<String> password = new ArrayList<>();

    private List<String> driverClassName = new ArrayList<>();

    private List<String> testQuery = new ArrayList<>();

    public void setNum(Integer num) {
        this.num = num;
    }
    
    public void setUrl(List<String> url) {
        this.url = url;
    }
    
    public void setUser(List<String> user) {
        this.user = user;
    }
    
    public void setPassword(List<String> password) {
        this.password = password;
    }

    public List<String> getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(List<String> driverClassName) {
        this.driverClassName = driverClassName;
    }

    public void setTestQuery(List<String> testQuery) {
        this.testQuery = testQuery;
    }

    /**
     * Build serveral HikariDataSource.
     *
     * @param environment {@link Environment}
     * @param callback    Callback function when constructing data source
     * @return List of {@link HikariDataSource}
     */
    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(num), "db.num is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(driverClassName), "db.driverClassName or db.driverClassName.[index] is null");
        for (int index = 0; index < num; index++) {
            int currentSize = index + 1;
            Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);
            DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);
            poolProperties.setDriverClassName(getOrDefault(driverClassName, index, JDBC_DRIVER_NAME).trim());
            poolProperties.setJdbcUrl(url.get(index).trim());
            poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());
            poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());
            HikariDataSource ds = poolProperties.getDataSource();
            if (StringUtils.isEmpty(ds.getConnectionTestQuery())) {
                ds.setConnectionTestQuery(getOrDefault(testQuery, index, TEST_QUERY).trim());
            }
            dataSources.add(ds);
            callback.accept(ds);
        }
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");
        return dataSources;
    }
    
    interface Callback<D> {
        
        /**
         * Perform custom logic.
         *
         * @param datasource dataSource.
         */
        void accept(D datasource);
    }
}

2.2 plugin模块改造

2.2.3版本的nacos已经适配了最新spring spi规范了,所以总体来讲开发一个nacos的插件是很容易的,并且源码里面已经给出了模板了,所以做一个nacos-datasource的plugin就直接在plugin模块下面对datasource模块进行改造即可,具体改造如下:

注意:以下代码改造都是在plugin模块-datasource模块下进行的改造,因此代码都是在datasource下进行的

2.2.1 DataSourceConstant.java

在该常量类中增加需要支持的数据库类型,后续有其他要支持数据库类型都统一定义在该类中即可,类:com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant

/*
 * Copyright 1999-2022 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alibaba.nacos.plugin.datasource.constants;

/**
 * The data source name.
 *
 * @author hyx
 **/

public class DataSourceConstant {
    public static final String MYSQL = "mysql";

    public static final String DM = "dm";

    public static final String DERBY = "derby";

    public static final String POSTGRESQL = "postgresql";

    public static final String KINGBASE8 = "kingbase8";
}
2.2.2 增加PrimaryKeyConstant.java类

这个常量类主要是为了适配数据库的大小写问题,放在constants包下

package:com.alibaba.nacos.plugin.datasource.constants

package com.alibaba.nacos.plugin.datasource.constants;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class PrimaryKeyConstant {

    /**
     * replace lower Statement.RETURN_GENERATED_KEYS into id key.
     */
    public static final String[] LOWER_RETURN_PRIMARY_KEYS = new String[]{"id"};

    /**
     * upper replace Statement.RETURN_GENERATED_KEYS into id key.
     * 
     */
    public static final String[] UPPER_RETURN_PRIMARY_KEYS = new String[]{"ID"};
}
2.2.3 新增对dialect的管理

每种数据库都有不同的方言,因此为了统一对dialect管理,好后续做通配,因此需要设计一下dialect,主要改造步骤有以下几步:

2.2.3.1 新增DatabaseDialectManager类

这个manager主要是适配多数据源多方言的情况,不局限于一个进程就只能配置一种数据源和方言,可同时配置多数据源;

新增package: com.alibaba.nacos.plugin.datasource.manager

在该package下新增类: DatabaseDialectManager

package com.alibaba.nacos.plugin.datasource.manager;

import com.alibaba.nacos.common.spi.NacosServiceLoader;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.dialect.DefaultDatabaseDialect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Description TODO
 * @Author wx (mailto:wang-xin@primeton.com)
 * @Date 2023/11/23
 */
public class DatabaseDialectManager {

    private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseDialectManager.class);

    private static final DatabaseDialectManager INSTANCE = new DatabaseDialectManager();

    private static final Map<String, DatabaseDialect> SUPPORT_DIALECT_MAP = new ConcurrentHashMap<String, DatabaseDialect>();

    private DatabaseDialectManager() {
    }

    static {
        //加载多种数据库方言为映射信息
        Collection<DatabaseDialect> dialectList = NacosServiceLoader.load(DatabaseDialect.class);

        for (DatabaseDialect dialect : dialectList) {
            SUPPORT_DIALECT_MAP.put(dialect.getType(), dialect);
        }
        if (SUPPORT_DIALECT_MAP.isEmpty()) {
            LOGGER.warn("[DatasourceDialectManager] Load DatabaseDialect fail, No DatabaseDialect implements");
        }
    }

    public DatabaseDialect getDialect(String databaseType) {
        DatabaseDialect databaseDialect = SUPPORT_DIALECT_MAP.get(databaseType);
        if (databaseDialect == null) {
            return new DefaultDatabaseDialect();
        }
        return databaseDialect;
    }

    /**
     * Get DatasourceDialectManager instance.
     *
     * @return DataSourceDialectProvider
     */
    public static DatabaseDialectManager getInstance() {
        return INSTANCE;
    }
}
2.2.3.2 新增package:com.alibaba.nacos.plugin.datasource.dialect

以下代码都是在该package下面进行新增

1. 新增接口 DatabaseDialect

这个接口主要是定义了一些每个数据库不同的实现的一些接口,比如:分页、字段大小写等

package com.alibaba.nacos.plugin.datasource.dialect;

/**
 * @Description TODO
 * @Author wx520
 * @Date 2023/11/23
 */
public interface DatabaseDialect {

    /**
     * get database type.
     * @return return database type name
     */
    public String getType();

    /**
     * get frist index page param.
     * @param page current pageNo
     * @param pageSize current pageSize
     * @return offset val or maxRange
     */
    public int getPagePrevNum(int page, int pageSize);

    /**
     * get second index page param.
     * @param page current pageNo
     * @param pageSize current pageSize
     * @return limit val or minRange
     */
    public int getPageLastNum(int page, int pageSize);

    /**
     * get page limit top data sql,contain  placeholder.
     * @param sql orign sql
     * @return append limit sql
     */
    public String getLimitTopSqlWithMark(String sql);

    /**
     * get page limit page data sql,contain  placeholder.
     * @param sql orign sql
     * @return append limit sql
     */
    public String getLimitPageSqlWithMark(String sql);

    /**
     * get page limit page data sql,using number.
     * @param sql orign sql
     * @param pageNo current pageNo
     * @param pageSize current pageSize
     * @return contain page number param sql
     */
    public String getLimitPageSql(String sql, int pageNo, int pageSize);

    /**
     * get page limit page data sql,using offset.
     * @param sql orign sql
     * @param startOffset current offset row
     * @param pageSize current pageSize
     * @return contain page number param sql
     */
    public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize);

    /**
     * get database return primary keys.
     * @return
     */
    public String[] getReturnPrimaryKeys();
}
2. 新增抽象类 AbstractDatabaseDialect

该抽象类主要是新增一些方言的默认实现,比如limit的默认实现,大部分数据库对于limit的支持都是limit a ; limit a,b 这种,也有不分数据库是不支持limit a,b的,支持limt b offset a这种等等,所以提供一个大部分都支持的默认实现,少部分差异的再具体重写实现。

package com.alibaba.nacos.plugin.datasource.dialect;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public abstract class AbstractDatabaseDialect implements DatabaseDialect {

    @Override
    public int getPagePrevNum(int page, int pageSize) {
        return (page - 1) * pageSize;
    }

    @Override
    public int getPageLastNum(int page, int pageSize) {
        return pageSize;
    }

    @Override
    public String getLimitTopSqlWithMark(String sql) {
        return sql + " LIMIT ? ";
    }

    @Override
    public String getLimitPageSqlWithMark(String sql) {
        return sql + " LIMIT ?,? ";
    }

    @Override
    public String getLimitPageSql(String sql, int pageNo, int pageSize) {
        return sql + "  LIMIT " + getPagePrevNum(pageNo, pageSize) + " , " + pageSize;
    }

    @Override
    public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize){
        return sql + "  LIMIT " + startOffset + " , " + pageSize;
    }

    @Override
    public String[] getReturnPrimaryKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
3. 新增默认实现类 DefaultDatabaseDialect

默认实现类默认为mysql,因此无需做什么特殊改动

package com.alibaba.nacos.plugin.datasource.dialect;

import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;

/**
 * @Description TODO
 * @Author wx
 * @Date 2023/11/23
 */
public class DefaultDatabaseDialect extends AbstractDatabaseDialect {
    @Override
    public String getType() {
        //默认mysql实现
        return DataSourceConstant.MYSQL;
    }
}
2.2.4 抽象BaseMapper

首先新增package: com.alibaba.nacos.plugin.datasource.impl.base

然后在该package下面新增一些BaseMapper,具体如下:

新增BaseConfigInfoAggrMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoAggrMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseConfigInfoAggrMapper extends ConfigInfoAggrMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseConfigInfoAggrMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.CONFIG_INFO_AGGR;
    }

    @Override
    public String findConfigInfoAggrByPageFetchRows(int startRow, int pageSize) {
        return databaseDialect.getLimitPageSqlWithOffset(
                "SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM config_info_aggr WHERE data_id= ? AND "
                        + "group_id= ? AND tenant_id= ? ORDER BY datum_id ", startRow, pageSize);
    }
}
新增BaseConfigInfoBetaMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoBetaMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseConfigInfoBetaMapper extends ConfigInfoBetaMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseConfigInfoBetaMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.CONFIG_INFO_BETA;
    }

    public String getLimitPageSqlWithOffset(String sql, int startRow, int pageSize) {
        return databaseDialect.getLimitPageSqlWithOffset(sql, startRow, pageSize);
    }

    @Override
    public String findAllConfigInfoBetaForDumpAllFetchRows(int startRow, int pageSize) {
        String sqlInner = getLimitPageSqlWithOffset("SELECT id FROM config_info_beta  ORDER BY id ", startRow,
                pageSize);
        String sql =
                " SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips,encrypted_data_key "
                        + " FROM ( " + sqlInner + "  )" + "  g, config_info_beta t WHERE g.id = t.id ";
        return sql;
    }
}
新增BaseConfigInfoMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.common.utils.StringUtils;
import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseConfigInfoMapper extends ConfigInfoMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseConfigInfoMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize) {
        return databaseDialect.getLimitPageSqlWithOffset(sql, startOffset, pageSize);
    }

    public String getLimitPageSqlWithMark(String sql) {
        return databaseDialect.getLimitPageSqlWithMark(sql);
    }

    @Override
    public String findConfigInfoByAppFetchRows(int startRow, int pageSize) {
        return getLimitPageSqlWithOffset("SELECT id,data_id,group_id,tenant_id,app_name,content FROM config_info"
                + " WHERE tenant_id LIKE ? AND app_name= ?", startRow, pageSize);
    }

    @Override
    public String getTenantIdList(int startRow, int pageSize) {
        return getLimitPageSqlWithOffset(
                "SELECT tenant_id FROM config_info WHERE tenant_id != '' GROUP BY tenant_id ", startRow, pageSize);
    }

    @Override
    public String getGroupIdList(int startRow, int pageSize) {
        return getLimitPageSqlWithOffset(
                "SELECT group_id FROM config_info WHERE tenant_id ='' GROUP BY group_id ", +startRow, pageSize);
    }

    @Override
    public String findAllConfigKey(int startRow, int pageSize) {
        String innerSql = getLimitPageSqlWithOffset(" SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id ",
                startRow, pageSize);
        return " SELECT data_id,group_id,app_name  FROM ( " + innerSql + " g, config_info t WHERE g.id = t.id  ";
    }

    @Override
    public String findAllConfigInfoBaseFetchRows(int startRow, int pageSize) {
        String innerSql = getLimitPageSqlWithMark(" SELECT id FROM config_info ORDER BY id ");
        return " SELECT t.id,data_id,group_id,content,md5" + " FROM ( " + innerSql + "  ) "
                + " g, config_info t  WHERE g.id = t.id ";
    }

    @Override
    public String findAllConfigInfoFragment(int startRow, int pageSize) {
        return getLimitPageSqlWithOffset(
                "SELECT id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,type,encrypted_data_key "
                        + "FROM config_info WHERE id > ? ORDER BY id ASC ", startRow, pageSize);
    }

    @Override
    public String findChangeConfigFetchRows(Map<String, String> params, final Timestamp startTime,
                                                  final Timestamp endTime, int startRow, int pageSize, long lastMaxId) {
        final String tenant = params.get(TENANT);
        final String dataId = params.get(DATA_ID);
        final String group = params.get(GROUP);
        final String appName = params.get(APP_NAME);
        final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;
        List<Object> paramList = new ArrayList<>();

        final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,md5,gmt_modified FROM config_info WHERE ";
        String where = " 1=1 ";
        if (!StringUtils.isBlank(dataId)) {
            where += " AND data_id LIKE ? ";
            paramList.add(dataId);
        }
        if (!StringUtils.isBlank(group)) {
            where += " AND group_id LIKE ? ";
            paramList.add(group);
        }
        if (!StringUtils.isBlank(tenantTmp)) {
            where += " AND tenant_id = ? ";
            paramList.add(tenantTmp);
        }
        if (!StringUtils.isBlank(appName)) {
            where += " AND app_name = ? ";
            paramList.add(appName);
        }
        if (startTime != null) {
            where += " AND gmt_modified >=? ";
            paramList.add(startTime);
        }
        if (endTime != null) {
            where += " AND gmt_modified <=? ";
            paramList.add(endTime);
        }
        String originSql = sqlFetchRows + where + " AND id > " + lastMaxId + " ORDER BY id ASC";
        return getLimitPageSqlWithOffset(originSql, 0, pageSize);
    }

    @Override
    public String listGroupKeyMd5ByPageFetchRows(int startRow, int pageSize) {
        String innerSql = getLimitPageSqlWithOffset(" SELECT id FROM config_info ORDER BY id ", startRow, pageSize);
        String sql =
                " SELECT t.id,data_id,group_id,tenant_id,app_name,md5,type,gmt_modified,encrypted_data_key FROM " + "( "
                        + innerSql + " ) g, config_info t WHERE g.id = t.id";
        return sql;
    }

    @Override
    public String findConfigInfoBaseLikeFetchRows(Map<String, String> params, int startRow, int pageSize) {
        final String dataId = params.get(DATA_ID);
        final String group = params.get(GROUP);
        final String content = params.get(CONTENT);
        final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,content FROM config_info WHERE ";
        String where = " 1=1 AND tenant_id='' ";
        if (!StringUtils.isBlank(dataId)) {
            where += " AND data_id LIKE ? ";
        }
        if (!StringUtils.isBlank(group)) {
            where += " AND group_id LIKE ";
        }
        if (!StringUtils.isBlank(content)) {
            where += " AND content LIKE ? ";
        }
        return getLimitPageSqlWithOffset(sqlFetchRows + where, startRow, pageSize);
    }

    @Override
    public String findConfigInfo4PageFetchRows(Map<String, String> params, int startRow, int pageSize) {
        final String appName = params.get(APP_NAME);
        final String dataId = params.get(DATA_ID);
        final String group = params.get(GROUP);
        final String content = params.get(CONTENT);
        List<Object> paramList = new ArrayList<>();
        final String sql = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,encrypted_data_key FROM config_info";
        StringBuilder where = new StringBuilder(" WHERE ");
        where.append(" tenant_id=? ");
        if (StringUtils.isNotBlank(dataId)) {
            where.append(" AND data_id=? ");
            paramList.add(dataId);
        }
        if (StringUtils.isNotBlank(group)) {
            where.append(" AND group_id=? ");
            paramList.add(group);
        }
        if (StringUtils.isNotBlank(appName)) {
            where.append(" AND app_name=? ");
            paramList.add(appName);
        }
        if (!StringUtils.isBlank(content)) {
            where.append(" AND content LIKE ? ");
            paramList.add(content);
        }
       return getLimitPageSqlWithOffset(sql + where, startRow, pageSize);
    }

    @Override
    public String findConfigInfoBaseByGroupFetchRows(int startRow, int pageSize) {
        String sql = "SELECT id,data_id,group_id,content FROM config_info WHERE group_id=? AND tenant_id=? ";
        return getLimitPageSqlWithOffset(sql, startRow, pageSize);
    }

    @Override
    public String findConfigInfoLike4PageFetchRows(Map<String, String> params, int startRow, int pageSize) {
        String dataId = params.get(DATA_ID);
        String group = params.get(GROUP);
        final String appName = params.get(APP_NAME);
        final String content = params.get(CONTENT);
        final String sqlFetchRows = "SELECT id,data_id,group_id,tenant_id,app_name,content,encrypted_data_key FROM config_info";
        StringBuilder where = new StringBuilder(" WHERE ");
        where.append(" tenant_id LIKE ? ");
        List<Object> paramList = new ArrayList<>();
        if (!StringUtils.isBlank(dataId)) {
            where.append(" AND data_id LIKE ? ");
            paramList.add(dataId);
        }
        if (!StringUtils.isBlank(group)) {
            where.append(" AND group_id LIKE ? ");
            paramList.add(group);
        }
        if (!StringUtils.isBlank(appName)) {
            where.append(" AND app_name = ? ");
            paramList.add(appName);
        }
        if (!StringUtils.isBlank(content)) {
            where.append(" AND content LIKE ? ");
            paramList.add(content);
        }
        return getLimitPageSqlWithOffset(sqlFetchRows + where, startRow, pageSize);
    }

    @Override
    public String findAllConfigInfoFetchRows(int startRow, int pageSize) {
        String innerSql = getLimitPageSqlWithMark("SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id ");
        return " SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5 " + " FROM ( " + innerSql + " )"
                + " g, config_info t  WHERE g.id = t.id ";
    }

    @Override
    public String getTableName() {
        return TableConstant.CONFIG_INFO;
    }
}
新增BaseConfigInfoTagMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoTagMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseConfigInfoTagMapper extends ConfigInfoTagMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseConfigInfoTagMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.CONFIG_INFO_TAG;
    }

    @Override
    public String findAllConfigInfoTagForDumpAllFetchRows(int startRow, int pageSize) {
        String innerSql = databaseDialect
                .getLimitPageSqlWithOffset("SELECT id FROM config_info_tag  ORDER BY id ", startRow, pageSize);
        return " SELECT t.id,data_id,group_id,tenant_id,tag_id,app_name,content,md5,gmt_modified " + " FROM (  "
                + innerSql + "  ) " + "g, config_info_tag t  WHERE g.id = t.id  ";
    }
}
新增BaseConfigTagsRelationMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.common.utils.StringUtils;
import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigTagsRelationMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseConfigTagsRelationMapper extends ConfigTagsRelationMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseConfigTagsRelationMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize) {
        return databaseDialect.getLimitPageSqlWithOffset(sql, startOffset, pageSize);
    }

    @Override
    public String getTableName() {
        return TableConstant.CONFIG_TAGS_RELATION;
    }

    @Override
    public String findConfigInfo4PageFetchRows(Map<String, String> params, int tagSize, int startRow, int pageSize) {
        final String appName = params.get("appName");
        final String dataId = params.get("dataId");
        final String group = params.get("group");
        final String content = params.get("content");
        List<Object> paramList = new ArrayList<>();
        StringBuilder where = new StringBuilder(" WHERE ");
        final String sql =
                "SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content FROM config_info  a LEFT JOIN "
                        + "config_tags_relation b ON a.id=b.id";

        where.append(" a.tenant_id=? ");
        if (StringUtils.isNotBlank(dataId)) {
            where.append(" AND a.data_id=? ");
            paramList.add(dataId);
        }
        if (StringUtils.isNotBlank(group)) {
            where.append(" AND a.group_id=? ");
            paramList.add(group);
        }
        if (StringUtils.isNotBlank(appName)) {
            where.append(" AND a.app_name=? ");
            paramList.add(appName);
        }
        if (!StringUtils.isBlank(content)) {
            where.append(" AND a.content LIKE ? ");
            paramList.add(content);
        }

        where.append(" AND b.tag_name IN (");
        for (int i = 0; i < tagSize; i++) {
            if (i != 0) {
                where.append(", ");
            }
            where.append('?');
        }
        where.append(") ");
        return getLimitPageSqlWithOffset(sql + where, startRow, pageSize);
    }

    @Override
    public String findConfigInfoLike4PageFetchRows(final Map<String, String> params,
                                                   int tagSize,
                                                   int startRow,
                                                   int pageSize) {
        final String appName = params.get("appName");
        final String content = params.get("content");
        final String dataId = params.get("dataId");
        final String group = params.get("group");
        List<Object> paramList = new ArrayList<>();
        StringBuilder where = new StringBuilder(" WHERE ");
        final String sqlFetchRows = "SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content "
                + "FROM config_info a LEFT JOIN config_tags_relation b ON a.id=b.id ";

        where.append(" a.tenant_id LIKE ? ");
        if (!StringUtils.isBlank(dataId)) {
            where.append(" AND a.data_id LIKE ? ");
            paramList.add(dataId);
        }
        if (!StringUtils.isBlank(group)) {
            where.append(" AND a.group_id LIKE ? ");
            paramList.add(group);
        }
        if (!StringUtils.isBlank(appName)) {
            where.append(" AND a.app_name = ? ");
            paramList.add(appName);
        }
        if (!StringUtils.isBlank(content)) {
            where.append(" AND a.content LIKE ? ");
            paramList.add(content);
        }
        where.append(" AND b.tag_name IN (");
        for (int i = 0; i < tagSize; i++) {
            if (i != 0) {
                where.append(", ");
            }
            where.append('?');
        }
        where.append(") ");
        return getLimitPageSqlWithOffset(sqlFetchRows + where, startRow, pageSize);
    }
}
新增BaseGroupCapacityMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.GroupCapacityMapperByMysql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseGroupCapacityMapper extends GroupCapacityMapperByMysql {

    private DatabaseDialect databaseDialect;

    public BaseGroupCapacityMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.GROUP_CAPACITY;
    }

    @Override
    public String selectGroupInfoBySize() {
        return databaseDialect.getLimitTopSqlWithMark("SELECT id, group_id FROM group_capacity WHERE id > ?");
    }
}
新增BaseTenantCapacityMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.TenantCapacityMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseTenantCapacityMapper extends TenantCapacityMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseTenantCapacityMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.TENANT_CAPACITY;
    }

    @Override
    public String getCapacityList4CorrectUsage() {
        return databaseDialect.getLimitTopSqlWithMark("SELECT id, tenant_id FROM tenant_capacity WHERE id>?");
    }
}
新增BaseTenantInfoMapper
package com.alibaba.nacos.plugin.datasource.impl.base;

import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect;
import com.alibaba.nacos.plugin.datasource.impl.mysql.TenantInfoMapperByMySql;
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class BaseTenantInfoMapper extends TenantInfoMapperByMySql {

    private DatabaseDialect databaseDialect;

    public BaseTenantInfoMapper() {
        databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource());
    }

    @Override
    public String getTableName() {
        return TableConstant.TENANT_INFO;
    }
}
2.2.5 达梦dm适配
1. 新增达梦的dialect实现以及Mapper

新增package: com.alibaba.nacos.plugin.datasource.impl.dm.dialect

在该package下面新增类:DaMengDatabaseDialect

package com.alibaba.nacos.plugin.datasource.impl.dm.dialect;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.dialect.AbstractDatabaseDialect;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx
 * @Date 2023/11/23
 */
public class DaMengDatabaseDialect extends AbstractDatabaseDialect {

    @Override
    public String[] getReturnPrimaryKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }

    @Override
    public String getType() {
        return DM;
    }
}

然后就是各个Mapper的覆写,因为dm基本都支持mysql的语法,所以这一块改动不大,具体代码如下:在package:com.alibaba.nacos.plugin.datasource.impl.dm下面新增以下类

ConfigInfoAggrMapperByDM

/*
 * Copyright 1999-2022 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoAggrMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoAggrMapperByDM extends BaseConfigInfoAggrMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoBetaMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoBetaMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoBetaMapperByDM extends BaseConfigInfoBetaMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoMapperByDM extends BaseConfigInfoMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoTagMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoTagMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoTagMapperByDM extends BaseConfigInfoTagMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
ConfigTagsRelationMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigTagsRelationMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigTagsRelationMapperByDM extends BaseConfigTagsRelationMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
GroupCapacityMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseGroupCapacityMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class GroupCapacityMapperByDM extends BaseGroupCapacityMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
HistoryConfigInfoMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class HistoryConfigInfoMapperByDM extends HistoryConfigInfoMapperByMySql {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
TenantCapacityMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseTenantCapacityMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class TenantCapacityMapperByDM extends BaseTenantCapacityMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
TenantInfoMapperByDM
package com.alibaba.nacos.plugin.datasource.impl.dm;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseTenantInfoMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.DM;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class TenantInfoMapperByDM extends BaseTenantInfoMapper {

    @Override
    public String getDataSource() {
        return DM;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.UPPER_RETURN_PRIMARY_KEYS;
    }
}
2. 支持达梦数据库错误码

在resource目录下新增sql-error-codes.xml

这个配置文件主要是映射达梦数据库错误码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd">

<!--
	- Default SQL error codes for well-known databases.
	- Can be overridden by definitions in a "sql-error-codes.xml" file
	- in the root of the class path.
	-
	- If the Database Product Name contains characters that are invalid
	- to use in the id attribute (like a space) then we need to add a property
	- named "databaseProductName"/"databaseProductNames" that holds this value.
	- If this property is present, then it will be used instead of the id for
	- looking up the error codes based on the current database.
	-->

<!--
    此文件主要做dameng数据库错误码与spring异常类的映射关系
    如果没有此文件 修改配置时唯一索冲突并不会抛出  DuplicateKeyException 的异常
-->
<beans>
    <!-- 支持达梦数据库错误码-->
    <bean id="DM" class="org.springframework.jdbc.support.SQLErrorCodes">
        <property name="databaseProductNames">
            <list>
                <!-- 数据源名称存在空格不能像Oracle一样直接作为beanId -->
                <value>DM DBMS</value>
            </list>
        </property>
        <property name="duplicateKeyCodes">
            <list>
                <value>-6602</value>
                <value>-6625</value>
            </list>
        </property>
    </bean>

</beans>

3. 增加SPI加载

为了能够让spring加载到我们的配置,需要进行对应services的修改

修改文件:resources/META-INF.services下的

com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect

增加自定义达梦的dialect配置

#
#  Copyright 1999-2022 Alibaba Group Holding Ltd.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#
#

com.alibaba.nacos.plugin.datasource.dialect.DefaultDatabaseDialect
com.alibaba.nacos.plugin.datasource.impl.dm.dialect.DaMengDatabaseDialect

修改resources/META-INF.services下的com.alibaba.nacos.plugin.datasource.mapper.Mapper文件

将上面自定义达梦相关的Mapper配置进去

#
# Copyright 1999-2022 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoAggrMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoBetaMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoTagMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigTagsRelationMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.TenantInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.TenantCapacityMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.GroupCapacityMapperByMysql

com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoAggrMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoBetaMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagsRelationMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.HistoryConfigInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.TenantInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.TenantCapacityMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.GroupCapacityMapperByDerby

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.GroupCapacityMapperByDM
com.alibaba.nacos.plugin.datasource.impl.dm.TenantCapacityMapperByDM
com.alibaba.nacos.plugin.datasource.impl.dm.TenantInfoMapperByDM
4. 达梦jdbc配置

修改datasource配置,配置如下:

spring.sql.init.platform=dm

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:dm://localhost:5236
db.user.0=SYSDBA
db.password.0=123456
db.driver-class-name.0=dm.jdbc.driver.DmDriver
5. dm脚本
CREATE TABLE "NOCOS"."USERS"
(
    "USERNAME" VARCHAR(50)  NOT NULL,
    "PASSWORD" VARCHAR(500) NOT NULL,
    "ENABLED"  TINYINT      NOT NULL
);
CREATE TABLE "NOCOS"."TENANT_INFO"
(
    "ID"            BIGINT IDENTITY(1,1) NOT NULL,
    "KP"            VARCHAR(128) NOT NULL,
    "TENANT_ID"     VARCHAR(128) DEFAULT ''
        NULL,
    "TENANT_NAME"   VARCHAR(128) DEFAULT ''
        NULL,
    "TENANT_DESC"   VARCHAR(256) NULL,
    "CREATE_SOURCE" VARCHAR(32) NULL,
    "GMT_CREATE"    BIGINT       NOT NULL,
    "GMT_MODIFIED"  BIGINT       NOT NULL
);
CREATE TABLE "NOCOS"."TENANT_CAPACITY"
(
    "ID"                BIGINT IDENTITY(1,1) NOT NULL,
    "TENANT_ID"         VARCHAR(128) DEFAULT ''
        NOT NULL,
    "QUOTA"             BIGINT       DEFAULT 0
        NOT NULL,
    "USAGE"             BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_SIZE"          BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_AGGR_COUNT"    BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_AGGR_SIZE"     BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_HISTORY_COUNT" BIGINT       DEFAULT 0
        NOT NULL,
    "GMT_CREATE"        TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
        NOT NULL,
    "GMT_MODIFIED"      TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
        NOT NULL
);
CREATE TABLE "NOCOS"."ROLES"
(
    "USERNAME" VARCHAR(50) NOT NULL,
    "ROLE"     VARCHAR(50) NOT NULL
);
CREATE TABLE "NOCOS"."PERMISSIONS"
(
    "ROLE"     VARCHAR(50)  NOT NULL,
    "RESOURCE" VARCHAR(255) NOT NULL,
    "ACTION"   VARCHAR(8)   NOT NULL
);
CREATE TABLE "NOCOS"."HIS_CONFIG_INFO"
(
    "ID"                 DECIMAL(20, 0) NOT NULL,
    "NID"                BIGINT IDENTITY(1,1) NOT NULL,
    "DATA_ID"            VARCHAR(255)   NOT NULL,
    "GROUP_ID"           VARCHAR(128)   NOT NULL,
    "APP_NAME"           VARCHAR(128) NULL,
    "CONTENT"            CLOB           NOT NULL,
    "MD5"                VARCHAR(32) NULL,
    "GMT_CREATE"         TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                        NOT NULL,
    "GMT_MODIFIED"       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                        NOT NULL,
    "SRC_USER"           TEXT NULL,
    "SRC_IP"             VARCHAR(50) NULL,
    "OP_TYPE"            CHAR(10) NULL,
    "TENANT_ID"          VARCHAR(128) DEFAULT ''
        NULL,
    "ENCRYPTED_DATA_KEY" TEXT           NOT NULL
);
CREATE TABLE "NOCOS"."GROUP_CAPACITY"
(
    "ID"                BIGINT IDENTITY(1,1) NOT NULL,
    "GROUP_ID"          VARCHAR(128) DEFAULT ''
        NOT NULL,
    "QUOTA"             BIGINT       DEFAULT 0
        NOT NULL,
    "USAGE"             BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_SIZE"          BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_AGGR_COUNT"    BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_AGGR_SIZE"     BIGINT       DEFAULT 0
        NOT NULL,
    "MAX_HISTORY_COUNT" BIGINT       DEFAULT 0
        NOT NULL,
    "GMT_CREATE"        TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
        NOT NULL,
    "GMT_MODIFIED"      TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
        NOT NULL
);
CREATE TABLE "NOCOS"."CONFIG_TAGS_RELATION"
(
    "ID"        BIGINT       NOT NULL,
    "TAG_NAME"  VARCHAR(128) NOT NULL,
    "TAG_TYPE"  VARCHAR(64) NULL,
    "DATA_ID"   VARCHAR(255) NOT NULL,
    "GROUP_ID"  VARCHAR(128) NOT NULL,
    "TENANT_ID" VARCHAR(128) DEFAULT ''
        NULL,
    "NID"       BIGINT IDENTITY(1,1) NOT NULL
);
CREATE TABLE "NOCOS"."CONFIG_INFO_TAG"
(
    "ID"           BIGINT IDENTITY(1,1) NOT NULL,
    "DATA_ID"      VARCHAR(255) NOT NULL,
    "GROUP_ID"     VARCHAR(128) NOT NULL,
    "TENANT_ID"    VARCHAR(128) DEFAULT ''
        NULL,
    "TAG_ID"       VARCHAR(128) NOT NULL,
    "APP_NAME"     VARCHAR(128) NULL,
    "CONTENT"      CLOB         NOT NULL,
    "MD5"          VARCHAR(32) NULL,
    "GMT_CREATE"   TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                NOT NULL,
    "GMT_MODIFIED" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                NOT NULL,
    "SRC_USER"     TEXT NULL,
    "SRC_IP"       VARCHAR(50) NULL
);
CREATE TABLE "NOCOS"."CONFIG_INFO_BETA"
(
    "ID"                 BIGINT IDENTITY(1,1) NOT NULL,
    "DATA_ID"            VARCHAR(255) NOT NULL,
    "GROUP_ID"           VARCHAR(128) NOT NULL,
    "APP_NAME"           VARCHAR(128) NULL,
    "CONTENT"            CLOB         NOT NULL,
    "BETA_IPS"           VARCHAR(1024) NULL,
    "MD5"                VARCHAR(32) NULL,
    "GMT_CREATE"         TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                      NOT NULL,
    "GMT_MODIFIED"       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                      NOT NULL,
    "SRC_USER"           TEXT NULL,
    "SRC_IP"             VARCHAR(50) NULL,
    "TENANT_ID"          VARCHAR(128) DEFAULT ''
        NULL,
    "ENCRYPTED_DATA_KEY" TEXT         NOT NULL
);
CREATE TABLE "NOCOS"."CONFIG_INFO_AGGR"
(
    "ID"           BIGINT IDENTITY(1,1) NOT NULL,
    "DATA_ID"      VARCHAR(255) NOT NULL,
    "GROUP_ID"     VARCHAR(128) NOT NULL,
    "DATUM_ID"     VARCHAR(255) NOT NULL,
    "CONTENT"      CLOB         NOT NULL,
    "GMT_MODIFIED" TIMESTAMP(0) NOT NULL,
    "APP_NAME"     VARCHAR(128) NULL,
    "TENANT_ID"    VARCHAR(128) DEFAULT ''
        NULL
);
CREATE TABLE "NOCOS"."CONFIG_INFO"
(
    "ID"                 BIGINT IDENTITY(1,1) NOT NULL,
    "DATA_ID"            VARCHAR(255) NOT NULL,
    "GROUP_ID"           VARCHAR(128) NULL,
    "CONTENT"            CLOB         NOT NULL,
    "MD5"                VARCHAR(32) NULL,
    "GMT_CREATE"         TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                      NOT NULL,
    "GMT_MODIFIED"       TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()
                                      NOT NULL,
    "SRC_USER"           TEXT NULL,
    "SRC_IP"             VARCHAR(50) NULL,
    "APP_NAME"           VARCHAR(128) NULL,
    "TENANT_ID"          VARCHAR(128) DEFAULT ''
        NULL,
    "C_DESC"             VARCHAR(256) NULL,
    "C_USE"              VARCHAR(64) NULL,
    "EFFECT"             VARCHAR(64) NULL,
    "TYPE"               VARCHAR(64) NULL,
    "C_SCHEMA"           TEXT NULL,
    "ENCRYPTED_DATA_KEY" TEXT         NOT NULL
);
ALTER TABLE "NOCOS"."USERS"
    ADD CONSTRAINT PRIMARY KEY ("USERNAME");

ALTER TABLE "NOCOS"."TENANT_INFO"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."TENANT_INFO"
    ADD CONSTRAINT "UK_TENANT_INFO_KPTENANTID" UNIQUE ("KP", "TENANT_ID");

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CONSTRAINT "UK_TENANT_ID" UNIQUE ("TENANT_ID");

ALTER TABLE "NOCOS"."ROLES"
    ADD CONSTRAINT "IDX_USER_ROLE" UNIQUE ("USERNAME", "ROLE");

ALTER TABLE "NOCOS"."PERMISSIONS"
    ADD CONSTRAINT "UK_ROLE_PERMISSION" UNIQUE ("ROLE", "RESOURCE", "ACTION");

ALTER TABLE "NOCOS"."HIS_CONFIG_INFO"
    ADD CONSTRAINT PRIMARY KEY ("NID");

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CONSTRAINT "UK_GROUP_ID" UNIQUE ("GROUP_ID");

ALTER TABLE "NOCOS"."CONFIG_TAGS_RELATION"
    ADD CONSTRAINT PRIMARY KEY ("NID");

ALTER TABLE "NOCOS"."CONFIG_TAGS_RELATION"
    ADD CONSTRAINT "UK_CONFIGTAGRELATION_CONFIGIDTAG" UNIQUE ("ID", "TAG_NAME", "TAG_TYPE");

ALTER TABLE "NOCOS"."CONFIG_INFO_TAG"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."CONFIG_INFO_TAG"
    ADD CONSTRAINT "UK_CONFIGINFOTAG_DATAGROUPTENANTTAG" UNIQUE ("DATA_ID", "GROUP_ID", "TENANT_ID", "TAG_ID");

ALTER TABLE "NOCOS"."CONFIG_INFO_BETA"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."CONFIG_INFO_BETA"
    ADD CONSTRAINT "UK_CONFIGINFOBETA_DATAGROUPTENANT" UNIQUE ("DATA_ID", "GROUP_ID", "TENANT_ID");

ALTER TABLE "NOCOS"."CONFIG_INFO_AGGR"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."CONFIG_INFO_AGGR"
    ADD CONSTRAINT "UK_CONFIGINFOAGGR_DATAGROUPTENANTDATUM" UNIQUE ("DATA_ID", "GROUP_ID", "TENANT_ID", "DATUM_ID");

ALTER TABLE "NOCOS"."CONFIG_INFO"
    ADD CONSTRAINT PRIMARY KEY ("ID");

ALTER TABLE "NOCOS"."CONFIG_INFO"
    ADD CONSTRAINT "UK_CONFIGINFO_DATAGROUPTENANT" UNIQUE ("DATA_ID", "GROUP_ID", "TENANT_ID");

CREATE INDEX "IDX_TENANT_ID"
    ON "NOCOS"."TENANT_INFO" ("TENANT_ID");

COMMENT
ON TABLE "NOCOS"."TENANT_INFO" IS 'tenant_info';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."KP" IS 'kp';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."TENANT_ID" IS 'tenant_id';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."TENANT_NAME" IS 'tenant_name';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."TENANT_DESC" IS 'tenant_desc';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."CREATE_SOURCE" IS 'create_source';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."TENANT_INFO"."GMT_MODIFIED" IS '修改时间';

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("QUOTA" >= 0) ENABLE;

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("MAX_HISTORY_COUNT" >= 0) ENABLE;

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("MAX_AGGR_SIZE" >= 0) ENABLE;

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("MAX_AGGR_COUNT" >= 0) ENABLE;

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("MAX_SIZE" >= 0) ENABLE;

ALTER TABLE "NOCOS"."TENANT_CAPACITY"
    ADD CHECK ("USAGE" >= 0) ENABLE;

COMMENT
ON TABLE "NOCOS"."TENANT_CAPACITY" IS '租户容量信息表';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."ID" IS '主键ID';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."TENANT_ID" IS 'Tenant ID';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."QUOTA" IS '配额,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."USAGE" IS '使用量';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."MAX_SIZE" IS '单个配置大小上限,单位为字节,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."MAX_AGGR_COUNT" IS '聚合子配置最大个数';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."MAX_AGGR_SIZE" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."MAX_HISTORY_COUNT" IS '最大变更历史数量';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."TENANT_CAPACITY"."GMT_MODIFIED" IS '修改时间';

ALTER TABLE "NOCOS"."HIS_CONFIG_INFO"
    ADD CHECK ("ID" >= 0) ENABLE;

CREATE INDEX "IDX_GMT_MODIFIED"
    ON "NOCOS"."HIS_CONFIG_INFO" ("GMT_MODIFIED");

CREATE INDEX "IDX_GMT_CREATE"
    ON "NOCOS"."HIS_CONFIG_INFO" ("GMT_CREATE");

CREATE INDEX "IDX_DID"
    ON "NOCOS"."HIS_CONFIG_INFO" ("DATA_ID");

COMMENT
ON TABLE "NOCOS"."HIS_CONFIG_INFO" IS '多租户改造';

COMMENT
ON COLUMN "NOCOS"."HIS_CONFIG_INFO"."APP_NAME" IS 'app_name';

COMMENT
ON COLUMN "NOCOS"."HIS_CONFIG_INFO"."TENANT_ID" IS '租户字段';

COMMENT
ON COLUMN "NOCOS"."HIS_CONFIG_INFO"."ENCRYPTED_DATA_KEY" IS '密钥';

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("QUOTA" >= 0) ENABLE;

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("MAX_HISTORY_COUNT" >= 0) ENABLE;

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("MAX_AGGR_SIZE" >= 0) ENABLE;

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("MAX_AGGR_COUNT" >= 0) ENABLE;

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("MAX_SIZE" >= 0) ENABLE;

ALTER TABLE "NOCOS"."GROUP_CAPACITY"
    ADD CHECK ("USAGE" >= 0) ENABLE;

COMMENT
ON TABLE "NOCOS"."GROUP_CAPACITY" IS '集群、各Group容量信息表';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."ID" IS '主键ID';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."GROUP_ID" IS 'Group ID,空字符表示整个集群';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."QUOTA" IS '配额,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."USAGE" IS '使用量';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."MAX_SIZE" IS '单个配置大小上限,单位为字节,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."MAX_AGGR_COUNT" IS '聚合子配置最大个数,,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."MAX_AGGR_SIZE" IS '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."MAX_HISTORY_COUNT" IS '最大变更历史数量';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."GROUP_CAPACITY"."GMT_MODIFIED" IS '修改时间';

COMMENT
ON TABLE "NOCOS"."CONFIG_TAGS_RELATION" IS 'config_tag_relation';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."TAG_NAME" IS 'tag_name';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."TAG_TYPE" IS 'tag_type';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."DATA_ID" IS 'data_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."GROUP_ID" IS 'group_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_TAGS_RELATION"."TENANT_ID" IS 'tenant_id';

COMMENT
ON TABLE "NOCOS"."CONFIG_INFO_TAG" IS 'config_info_tag';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."DATA_ID" IS 'data_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."GROUP_ID" IS 'group_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."TENANT_ID" IS 'tenant_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."TAG_ID" IS 'tag_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."APP_NAME" IS 'app_name';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."CONTENT" IS 'content';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."MD5" IS 'md5';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."GMT_MODIFIED" IS '修改时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."SRC_USER" IS 'source user';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_TAG"."SRC_IP" IS 'source ip';

COMMENT
ON TABLE "NOCOS"."CONFIG_INFO_BETA" IS 'config_info_beta';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."DATA_ID" IS 'data_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."GROUP_ID" IS 'group_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."APP_NAME" IS 'app_name';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."CONTENT" IS 'content';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."BETA_IPS" IS 'betaIps';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."MD5" IS 'md5';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."GMT_MODIFIED" IS '修改时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."SRC_USER" IS 'source user';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."SRC_IP" IS 'source ip';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."TENANT_ID" IS '租户字段';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_BETA"."ENCRYPTED_DATA_KEY" IS '密钥';

COMMENT
ON TABLE "NOCOS"."CONFIG_INFO_AGGR" IS '增加租户字段';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."DATA_ID" IS 'data_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."GROUP_ID" IS 'group_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."DATUM_ID" IS 'datum_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."CONTENT" IS '内容';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."GMT_MODIFIED" IS '修改时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO_AGGR"."TENANT_ID" IS '租户字段';

COMMENT
ON TABLE "NOCOS"."CONFIG_INFO" IS 'config_info';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."ID" IS 'id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."DATA_ID" IS 'data_id';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."CONTENT" IS 'content';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."MD5" IS 'md5';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."GMT_CREATE" IS '创建时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."GMT_MODIFIED" IS '修改时间';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."SRC_USER" IS 'source user';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."SRC_IP" IS 'source ip';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."TENANT_ID" IS '租户字段';

COMMENT
ON COLUMN "NOCOS"."CONFIG_INFO"."ENCRYPTED_DATA_KEY" IS '密钥';



INSERT INTO "NOCOS"."USERS"("USERNAME", "PASSWORD", "ENABLED")
VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);

INSERT INTO "NOCOS"."ROLES"("USERNAME", "ROLE")
VALUES ('nacos', 'ROLE_ADMIN');

6. 打包、指定加载依赖运行

最后在nacos源码最外层pom所在文件夹打开cmd运行打包命令:

mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U

命令结束会在distribution模块所在的target目录下生成zip包和tar.gz包,

解压对应的安装包,找到bin目录下的启动脚本,查看-Dloader.path命令后面指定的目录,在该任意目录下放进达梦的jdbc驱动即可,最后,修改conf下面的配置文件中的datasource配置,然后驱动命令运行即可

2.2.6 kingbase8适配

本次选举的kingbase版本是kingbaseV008R006C008B0014,选的是兼容mysql模式,其他版本以及兼容oracle或者pg模式的kingbase仅供参考,如果说能运行脚本,一般就没多大问题

1. 新增kingbase的dialect实现以及Mapper

新增package: com.alibaba.nacos.plugin.datasource.impl.kingbase8.dialect

在该package下面新增类:Kingbase8DatabaseDialect

主要是对limit做了特殊处理

package com.alibaba.nacos.plugin.datasource.impl.kingbase8.dialect;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.dialect.AbstractDatabaseDialect;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx
 * @Date 2024/1/2
 */
public class Kingbase8DatabaseDialect extends AbstractDatabaseDialect {

    @Override
    public String getLimitPageSqlWithMark(String sql) {
        return sql + " LIMIT ? OFFSET ? ";
    }

    @Override
    public String getLimitPageSql(String sql, int pageNo, int pageSize) {
        return sql + "  LIMIT " + pageSize + " OFFSET " + getPagePrevNum(pageNo, pageSize);
    }

    @Override
    public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize){
        return sql + "  LIMIT " + pageSize + " OFFSET " + startOffset;
    }

    @Override
    public String[] getReturnPrimaryKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }

    @Override
    public String getType() {
        return KINGBASE8;
    }
}

然后就是各个Mapper的覆写,因为上面的方言以及做了处理,所以这一块改动不大,具体代码如下:在package:com.alibaba.nacos.plugin.datasource.impl.kingbase8下面新增以下类

ConfigInfoAggrMapperByKingbase8
/*
 * Copyright 1999-2022 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoAggrMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoAggrMapperByKingbase8 extends BaseConfigInfoAggrMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoBetaMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoBetaMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigInfoBetaMapperByKingbase8 extends BaseConfigInfoBetaMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx
 * @Date 2023/11/23
 */
public class ConfigInfoMapperByKingbase8 extends BaseConfigInfoMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
ConfigInfoTagMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigInfoTagMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx
 * @Date 2023/11/23
 */
public class ConfigInfoTagMapperByKingbase8 extends BaseConfigInfoTagMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
ConfigTagsRelationMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseConfigTagsRelationMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class ConfigTagsRelationMapperByKingbase8 extends BaseConfigTagsRelationMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
GroupCapacityMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseGroupCapacityMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class GroupCapacityMapperByKingbase8 extends BaseGroupCapacityMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
HistoryConfigInfoMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class HistoryConfigInfoMapperByKingbase8 extends HistoryConfigInfoMapperByMySql {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
TenantCapacityMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseTenantCapacityMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx 
 * @Date 2023/11/23
 */
public class TenantCapacityMapperByKingbase8 extends BaseTenantCapacityMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
TenantInfoMapperByKingbase8
package com.alibaba.nacos.plugin.datasource.impl.kingbase8;

import com.alibaba.nacos.plugin.datasource.constants.PrimaryKeyConstant;
import com.alibaba.nacos.plugin.datasource.impl.base.BaseTenantInfoMapper;

import static com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.KINGBASE8;

/**
 * @Description TODO
 * @Author wx
 * @Date 2023/11/23
 */
public class TenantInfoMapperByKingbase8 extends BaseTenantInfoMapper {

    @Override
    public String getDataSource() {
        return KINGBASE8;
    }

    @Override
    public String[] getPrimaryKeyGeneratedKeys() {
        return PrimaryKeyConstant.LOWER_RETURN_PRIMARY_KEYS;
    }
}
2. 增加SPI加载

为了能够让spring加载到我们的配置,需要进行对应services的修改

修改文件:resources/META-INF.services下的

com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect

增加自定义kingbase8的dialect配置

#
#  Copyright 1999-2022 Alibaba Group Holding Ltd.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#
#

com.alibaba.nacos.plugin.datasource.dialect.DefaultDatabaseDialect
com.alibaba.nacos.plugin.datasource.impl.kingbase8.dialect.Kingbase8DatabaseDialect

修改resources/META-INF.services下的com.alibaba.nacos.plugin.datasource.mapper.Mapper文件

将上面自定义kingbase8相关的Mapper配置进去

#
# Copyright 1999-2022 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoAggrMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoBetaMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigInfoTagMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.ConfigTagsRelationMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.HistoryConfigInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.TenantInfoMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.TenantCapacityMapperByMySql
com.alibaba.nacos.plugin.datasource.impl.mysql.GroupCapacityMapperByMysql

com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoAggrMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoBetaMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.ConfigInfoTagsRelationMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.HistoryConfigInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.TenantInfoMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.TenantCapacityMapperByDerby
com.alibaba.nacos.plugin.datasource.impl.derby.GroupCapacityMapperByDerby


com.alibaba.nacos.plugin.datasource.impl.kingbase8.ConfigInfoAggrMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.ConfigInfoBetaMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.ConfigInfoMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.ConfigInfoTagMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.ConfigTagsRelationMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.GroupCapacityMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.HistoryConfigInfoMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.TenantCapacityMapperByKingbase8
com.alibaba.nacos.plugin.datasource.impl.kingbase8.TenantInfoMapperByKingbase8
3. kingbase8 jdbc配置
spring.sql.init.platform=kingbase8

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:kingbase8://localhost:54321/xxxx
db.user.0=xxxx
db.password.0=123456
db.driver-class-name.0=com.kingbase8.Driver
4. kingbase8脚本
CREATE TABLE "config_info" (
	"id" BIGSERIAL NOT NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(255 char) NULL,
	"content" text NOT NULL,
	"md5" character varying(32 char) NULL,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"src_user" text NULL,
	"src_ip" character varying(50 char) NULL,
	"app_name" character varying(128 char) NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"c_desc" character varying(256 char) NULL,
	"c_use" character varying(64 char) NULL,
	"effect" character varying(64 char) NULL,
	"type" character varying(64 char) NULL,
	"c_schema" text NULL,
	"encrypted_data_key" text  NULL,
	CONSTRAINT "PRIMARY_73F26186" PRIMARY KEY (id),
	CONSTRAINT "uk_configinfo_datagrouptenant_C827FEB8" UNIQUE (data_id, group_id, tenant_id)
);

CREATE TABLE "config_info_aggr" (
	"id" BIGSERIAL NOT NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(255 char) NOT NULL,
	"datum_id" character varying(255 char) NOT NULL,
	"content" text NOT NULL,
	"gmt_modified" timestamp(0) without time zone NOT NULL,
	"app_name" character varying(128 char) NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	CONSTRAINT "PRIMARY_F787E5C0" PRIMARY KEY (id),
	CONSTRAINT "uk_configinfoaggr_datagrouptenantdatum_D10078D8" UNIQUE (data_id, group_id, tenant_id, datum_id)
);


CREATE TABLE "config_info_beta" (
	"id" BIGSERIAL NOT NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(128 char) NOT NULL,
	"app_name" character varying(128 char) NULL,
	"content" text NOT NULL,
	"beta_ips" character varying(1024 char) NULL,
	"md5" character varying(32 char) NULL,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"src_user" text NULL,
	"src_ip" character varying(50 char) NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"encrypted_data_key" text  NULL,
	CONSTRAINT "PRIMARY_E3F5B61F" PRIMARY KEY (id),
	CONSTRAINT "uk_configinfobeta_datagrouptenant_E4D7C681" UNIQUE (data_id, group_id, tenant_id)
);

CREATE TABLE "config_info_tag" (
	"id" BIGSERIAL NOT NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(128 char) NOT NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"tag_id" character varying(128 char) NOT NULL,
	"app_name" character varying(128 char) NULL,
	"content" text NOT NULL,
	"md5" character varying(32 char) NULL,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"src_user" text NULL,
	"src_ip" character varying(50 char) NULL,
	CONSTRAINT "PRIMARY_26447CE1" PRIMARY KEY (id),
	CONSTRAINT "uk_configinfotag_datagrouptenanttag_5CBEB0AC" UNIQUE (data_id, group_id, tenant_id, tag_id)
);

CREATE TABLE "config_tags_relation" (
	"id" bigint NOT NULL,
	"tag_name" character varying(128 char) NOT NULL,
	"tag_type" character varying(64 char) NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(128 char) NOT NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"nid" BIGSERIAL NOT NULL,
	CONSTRAINT "PRIMARY_82226084" PRIMARY KEY (nid),
	CONSTRAINT "uk_configtagrelation_configidtag_25395725" UNIQUE (id, tag_name, tag_type)
);
CREATE INDEX idx_tenant_id_4FB846F8 ON config_tags_relation USING btree (tenant_id);

CREATE TABLE "group_capacity" (
	"id" BIGSERIAL NOT NULL,
	"group_id" character varying(128 char) NOT NULL DEFAULT NULL::varchar,
	"quota" bigint NOT NULL DEFAULT 0,
	"usage" bigint NOT NULL DEFAULT 0,
	"max_size" bigint NOT NULL DEFAULT 0,
	"max_aggr_count" bigint NOT NULL DEFAULT 0,
	"max_aggr_size" bigint NOT NULL DEFAULT 0,
	"max_history_count" bigint NOT NULL DEFAULT 0,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	CONSTRAINT "PRIMARY_D72B7E75" PRIMARY KEY (id),
	CONSTRAINT "uk_group_id_377325F2" UNIQUE (group_id)
);

CREATE TABLE "his_config_info" (
	"id" numeric NOT NULL,
	"nid" BIGSERIAL NOT NULL,
	"data_id" character varying(255 char) NOT NULL,
	"group_id" character varying(128 char) NOT NULL,
	"app_name" character varying(128 char) NULL,
	"content" text NOT NULL,
	"md5" character varying(32 char) NULL,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"src_user" text NULL,
	"src_ip" character varying(50 char) NULL,
	"op_type" character(10 char) NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"encrypted_data_key" text NULL,
	CONSTRAINT "PRIMARY_93A4DC6B" PRIMARY KEY (nid)
);
CREATE INDEX idx_did_8DE97C10 ON his_config_info USING btree (data_id);
CREATE INDEX idx_gmt_create_F3B3E5A1 ON his_config_info USING btree (gmt_create);
CREATE INDEX idx_gmt_modified_42DBB1BB ON his_config_info USING btree (gmt_modified);

CREATE TABLE "permissions" (
	"role" character varying(50 char) NOT NULL,
	"resource" character varying(255 char) NOT NULL,
	"action" character varying(8 char) NOT NULL,
	CONSTRAINT "uk_role_permission_9C323780" UNIQUE (role, resource, action)
);

CREATE TABLE "roles" (
	"username" character varying(50 char) NOT NULL,
	"role" character varying(50 char) NOT NULL,
	CONSTRAINT "idx_user_role_314C5701" UNIQUE (username, role)
);

CREATE TABLE "tenant_capacity" (
	"id" BIGSERIAL NOT NULL,
	"tenant_id" character varying(128 char) NOT NULL DEFAULT NULL::varchar,
	"quota" bigint NOT NULL DEFAULT 0,
	"usage" bigint NOT NULL DEFAULT 0,
	"max_size" bigint NOT NULL DEFAULT 0,
	"max_aggr_count" bigint NOT NULL DEFAULT 0,
	"max_aggr_size" bigint NOT NULL DEFAULT 0,
	"max_history_count" bigint NOT NULL DEFAULT 0,
	"gmt_create" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	"gmt_modified" timestamp(0) without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
	CONSTRAINT "PRIMARY_F4CCC2AA" PRIMARY KEY (id),
	CONSTRAINT "uk_tenant_id_22935E1" UNIQUE (tenant_id)
);

CREATE TABLE "tenant_info" (
	"id" BIGSERIAL NOT NULL,
	"kp" character varying(128 char) NOT NULL,
	"tenant_id" character varying(128 char) NULL DEFAULT NULL::varchar,
	"tenant_name" character varying(128 char) NULL DEFAULT NULL::varchar,
	"tenant_desc" character varying(256 char) NULL,
	"create_source" character varying(32 char) NULL,
	"gmt_create" bigint NOT NULL,
	"gmt_modified" bigint NOT NULL,
	CONSTRAINT "PRIMARY_8B91ED1E" PRIMARY KEY (id),
	CONSTRAINT "uk_tenant_info_kptenantid_195888C1" UNIQUE (kp, tenant_id)
);
CREATE INDEX idx_tenant_id_ABB71DBA ON tenant_info USING btree (tenant_id);

CREATE TABLE "users" (
	"username" character varying(50 char) NOT NULL,
	"password" character varying(500 char) NOT NULL,
	"enabled" tinyint NOT NULL,
	CONSTRAINT "PRIMARY_1A6B23BE" PRIMARY KEY (username)
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

5. 打包、指定加载依赖运行

最后在nacos源码最外层pom所在文件夹打开cmd运行打包命令:

mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U

命令结束会在distribution模块所在的target目录下生成zip包和tar.gz包,

解压对应的安装包,找到bin目录下的启动脚本,查看-Dloader.path命令后面指定的目录,在该任意目录下放进kingbase8的jdbc驱动即可,最后,修改conf下面的配置文件中的datasource配置,然后驱动命令运行即可

2.2.7 其他数据库的适配

介于时间和精力问题,本人没有对其他数据库进行适配,但是架子已经搭好了,如有需要进行其他数据库的适配,主要分以下几个步骤


1.脚本的适配


    针对nacos的脚本进行对应数据库的适配修改
    脚本主要改造的地方有几点
        1.自增
            针对不同数据库进行自增适配,或是用数据库支持的默认序列,或是用自定义创建序列进行实现
        2.字段类型的适配
            不同数据库对于string类型、int类型、date类型有对应的jdbc类型,只需要修改对应类型即可
        3.建表语句的主键和索引语句
            不同数据库对于指定主键和创建索引可能会有差异
    脚本这块关注这几点就可以了


2.创建对应的Dialect以及mapper


    创建自己数据库的Dialect,按照上面dm和kingbase一样,实现AbstractDatabaseDialect
    然后对里面的方法如果有需要重写的就进行重写
    主要是limit的支持,如果支持AbstractDatabaseDialect里面的写法就不用重写,不支持就需要重写自己的处理逻辑
    对应的Mapper里面的方法如果有需要特殊处理的就进行重写,没有就按照dm和kingbase的写法进行默认实现即可


3.配置SPI


    按照dm和kingbase的配置步骤进行spi配置即可


4.修改datasource配置


    进行对应数据库的datasouce配置即可


5.jdbc驱动问题


    我的建议是最好是打完包之后按照nacos的-Dloader.path命令后面指定的目录放驱动就行
    无需改源码的pom依赖


6.打包运行


    打包,放驱动,该配置,运行即可

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐