• nacos适配达梦、瀚高、人大金仓数据库及部分源码探究


    一.插件实现

      1.插件目录结构

      2.pom依赖

            <dependency>
                <groupId>com.alibaba.nacosgroupId>
                <artifactId>nacos-datasource-pluginartifactId>
                <version>2.2.4version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-jdbcartifactId>
                <version>3.1.3.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>com.damenggroupId>
                <artifactId>Dm8JdbcDriver18artifactId>
                <version>8.1.1.49version>
            dependency>
            
            <dependency>
                <groupId>com.highgogroupId>
                <artifactId>HgdbJdbcartifactId>
                <version>6.2.2version>
            dependency>
            
            <dependency>
                <groupId>com.kingbasegroupId>
                <artifactId>kingbase8artifactId>
                <version>8.2.0version>
            dependency>
    View Code

      3.代码实现

      3.1.DataSourceConstant

    public class DataSourceConstant {
        public static final String MYSQL = "mysql";
        
        public static final String DERBY = "derby";
    
        public static final String DM="dm";
    
        public static final String HIGHGO="highgo";
    
        public static final String KINGBASE="kingbase";
    
    }
    View Code

      3.2.公共方法

       3.2.1.AbstractConfigInfoAggrMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoAggrMapper;
    
    
    public abstract class AbstractConfigInfoAggrMapperCommon extends AbstractMapper implements ConfigInfoAggrMapper {
    
        @Override
        public String batchRemoveAggr(int datumSize) {
            final StringBuilder placeholderString = new StringBuilder();
            for (int i = 0; i < datumSize; i++) {
                if (i != 0) {
                    placeholderString.append(", ");
                }
                placeholderString.append('?');
            }
            return "DELETE FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND datum_id IN ("
                    + placeholderString + ")";
        }
    
        @Override
        public String aggrConfigInfoCount(int size, boolean isIn) {
            StringBuilder sql = new StringBuilder(
                    "SELECT count(*) FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND datum_id");
            if (isIn) {
                sql.append(" IN (");
            } else {
                sql.append(" NOT IN (");
            }
            for (int i = 0; i < size; i++) {
                if (i > 0) {
                    sql.append(", ");
                }
                sql.append('?');
            }
            sql.append(')');
    
            return sql.toString();
        }
    
        public String findConfigInfoAggrIsOrdered() {
            return "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";
        }
    
        public String findConfigInfoAggrByPageFetchRows(int startRow, int pageSize) {
            return "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 LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
        public String findAllAggrGroupByDistinct() {
            return "SELECT DISTINCT data_id, group_id, tenant_id FROM config_info_aggr";
        }
    
        public String getTableName() {
            return TableConstant.CONFIG_INFO_AGGR;
        }
    
    }
    View Code
       3.2.2.AbstractConfigInfoBetaMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoBetaMapper;
    
    
    public abstract class AbstractConfigInfoBetaMapperCommon extends AbstractMapper implements ConfigInfoBetaMapper {
    
        public String updateConfigInfo4BetaCas() {
            return "UPDATE config_info_beta SET content = ?,md5 = ?,beta_ips = ?,src_ip = ?,src_user = ?,gmt_modified = ?,app_name = ? "
                    + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND (md5 = ? or md5 is null or md5 = '')";
        }
    
        public String findAllConfigInfoBetaForDumpAllFetchRows(int startRow, int pageSize) {
            return " SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips,encrypted_data_key "
                    + " FROM ( SELECT id FROM config_info_beta  ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow
                    + " )" + "  g, config_info_beta t WHERE g.id = t.id ";
        }
    
        public String getTableName() {
            return TableConstant.CONFIG_INFO_BETA;
        }
    }
    View Code
       3.2.3.AbstractConfigInfoTagMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoTagMapper;
    
    public abstract class AbstractConfigInfoTagMapperCommon extends AbstractMapper implements ConfigInfoTagMapper {
    
    
        public String updateConfigInfo4TagCas() {
            return "UPDATE config_info_tag SET content = ?, md5 = ?, src_ip = ?,src_user = ?,gmt_modified = ?,app_name = ? "
                    + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND tag_id = ? AND (md5 = ? OR md5 IS NULL OR md5 = '')";
        }
    
    
        public String findAllConfigInfoTagForDumpAllFetchRows(int startRow, int pageSize) {
            return " SELECT t.id,data_id,group_id,tenant_id,tag_id,app_name,content,md5,gmt_modified "
                    + " FROM (  SELECT id FROM config_info_tag  ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow
                    + " ) " + "g, config_info_tag t  WHERE g.id = t.id  ";
        }
    
    
        public String getTableName() {
            return TableConstant.CONFIG_INFO_TAG;
        }
    
    }
    View Code
       3.2.4.AbstractConfigTagsRelationMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.common.utils.StringUtils;
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.ConfigTagsRelationMapper;
    
    import java.util.Map;
    
    public abstract class AbstractConfigTagsRelationMapperCommon extends AbstractMapper implements ConfigTagsRelationMapper {
    
    
        public String findConfigInfo4PageCountRows(final Map params, final int tagSize) {
            final String appName = params.get("appName");
            final String dataId = params.get("dataId");
            final String group = params.get("group");
            StringBuilder where = new StringBuilder(" WHERE ");
            final String sqlCount = "SELECT count(*) 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=? ");
            }
            if (StringUtils.isNotBlank(group)) {
                where.append(" AND a.group_id=? ");
            }
            if (StringUtils.isNotBlank(appName)) {
                where.append(" AND a.app_name=? ");
            }
            where.append(" AND b.tag_name IN (");
            for (int i = 0; i < tagSize; i++) {
                if (i != 0) {
                    where.append(", ");
                }
                where.append('?');
            }
            where.append(") ");
            return sqlCount + where;
        }
    
    
        public String findConfigInfo4PageFetchRows(Map 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");
            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=? ");
            }
            if (StringUtils.isNotBlank(group)) {
                where.append(" AND a.group_id=? ");
            }
            if (StringUtils.isNotBlank(appName)) {
                where.append(" AND a.app_name=? ");
            }
    
            where.append(" AND b.tag_name IN (");
            for (int i = 0; i < tagSize; i++) {
                if (i != 0) {
                    where.append(", ");
                }
                where.append('?');
            }
            where.append(") ");
            return sql + where + " LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
    
        public String findConfigInfoLike4PageCountRows(final Map params, int tagSize) {
            final String appName = params.get("appName");
            final String content = params.get("content");
            final String dataId = params.get("dataId");
            final String group = params.get("group");
            StringBuilder where = new StringBuilder(" WHERE ");
            final String sqlCountRows = "SELECT count(*) 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 ? ");
            }
            if (!StringUtils.isBlank(group)) {
                where.append(" AND a.group_id LIKE ? ");
            }
            if (!StringUtils.isBlank(appName)) {
                where.append(" AND a.app_name = ? ");
            }
            if (!StringUtils.isBlank(content)) {
                where.append(" AND a.content LIKE ? ");
            }
    
            where.append(" AND b.tag_name IN (");
            for (int i = 0; i < tagSize; i++) {
                if (i != 0) {
                    where.append(", ");
                }
                where.append('?');
            }
            where.append(") ");
            return sqlCountRows + where;
        }
    
    
        public String findConfigInfoLike4PageFetchRows(final Map 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");
            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 ? ");
            }
            if (!StringUtils.isBlank(group)) {
                where.append(" AND a.group_id LIKE ? ");
            }
            if (!StringUtils.isBlank(appName)) {
                where.append(" AND a.app_name = ? ");
            }
            if (!StringUtils.isBlank(content)) {
                where.append(" AND a.content LIKE ? ");
            }
    
            where.append(" AND b.tag_name IN (");
            for (int i = 0; i < tagSize; i++) {
                if (i != 0) {
                    where.append(", ");
                }
                where.append('?');
            }
            where.append(") ");
            return sqlFetchRows + where + " LIMIT " + startRow + "," + pageSize;
        }
    
    
        public String getTableName() {
            return TableConstant.CONFIG_TAGS_RELATION;
        }
    
    }
    View Code
       3.2.5.AbstractGroupCapacityMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.GroupCapacityMapper;
    
    
    public abstract class AbstractGroupCapacityMapperCommon extends AbstractMapper implements GroupCapacityMapper {
    
    
        public String insertIntoSelect() {
            return "INSERT INTO group_capacity (group_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size,gmt_create,"
                    + " gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info";
        }
    
    
        public String insertIntoSelectByWhere() {
            return "INSERT INTO group_capacity (group_id, quota,`usage`, `max_size`, max_aggr_count, max_aggr_size, gmt_create,"
                    + " gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE group_id=? AND tenant_id = ''";
        }
    
    
        public String incrementUsageByWhereQuotaEqualZero() {
            return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < ? AND quota = 0";
        }
    
    
        public String incrementUsageByWhereQuotaNotEqualZero() {
            return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < quota AND quota != 0";
        }
    
    
        public String incrementUsageByWhere() {
            return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ?";
        }
    
    
        public String decrementUsageByWhere() {
            return "UPDATE group_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE group_id = ? AND `usage` > 0";
        }
    
    
        public String updateUsage() {
            return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info), gmt_modified = ? WHERE group_id = ?";
        }
    
    
        public String updateUsageByWhere() {
            return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE group_id=? AND tenant_id = ''),"
                    + " gmt_modified = ? WHERE group_id= ?";
        }
    
    
        public String selectGroupInfoBySize() {
            return "SELECT id, group_id FROM group_capacity WHERE id > ? LIMIT ?";
        }
    
    
        public String getTableName() {
            return TableConstant.GROUP_CAPACITY;
        }
    
    
    }
    View Code
       3.2.6.AbstractHistoryConfigInfoMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.HistoryConfigInfoMapper;
    
    
    public abstract class AbstractHistoryConfigInfoMapperCommon extends AbstractMapper implements HistoryConfigInfoMapper {
    
    
        public String removeConfigHistory() {
            return "DELETE FROM his_config_info WHERE gmt_modified < ? LIMIT ?";
        }
    
    
        public String findConfigHistoryCountByTime() {
            return "SELECT count(*) FROM his_config_info WHERE gmt_modified < ?";
        }
    
    
        public String findDeletedConfig() {
            return "SELECT DISTINCT data_id, group_id, tenant_id FROM his_config_info WHERE op_type = 'D' AND gmt_modified >= ? AND gmt_modified <= ?";
        }
    
    
        public String findConfigHistoryFetchRows() {
            return "SELECT nid,data_id,group_id,tenant_id,app_name,src_ip,src_user,op_type,gmt_create,gmt_modified FROM his_config_info "
                    + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? ORDER BY nid DESC";
        }
    
    
        public String detailPreviousConfigHistory() {
            return "SELECT nid,data_id,group_id,tenant_id,app_name,content,md5,src_user,src_ip,op_type,gmt_create,gmt_modified "
                    + "FROM his_config_info WHERE nid = (SELECT max(nid) FROM his_config_info WHERE id = ?) ";
        }
    
        public String pageFindConfigHistoryFetchRows(int pageNo, int pageSize) {
            final int offset = (pageNo - 1) * pageSize;
            final int limit = pageSize;
            return  "SELECT nid,data_id,group_id,tenant_id,app_name,src_ip,src_user,op_type,gmt_create,gmt_modified FROM his_config_info "
                    + "WHERE data_id = ? AND group_id = ? AND tenant_id = ? ORDER BY nid DESC  LIMIT " + offset + "," + limit;
        }
    
        public String getTableName() {
            return TableConstant.HIS_CONFIG_INFO;
        }
    
    
    }
    View Code
       3.2.7.AbstractTenantCapacityMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.TenantCapacityMapper;
    
    public abstract class AbstractTenantCapacityMapperCommon extends AbstractMapper implements TenantCapacityMapper {
    
    
        public String incrementUsageWithDefaultQuotaLimit() {
            return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <"
                    + " ? AND quota = 0";
        }
    
    
        public String incrementUsageWithQuotaLimit() {
            return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < "
                    + "quota AND quota != 0";
        }
    
    
        public String incrementUsage() {
            return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?";
        }
    
    
        public String decrementUsage() {
            return "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0";
        }
    
    
        public String correctUsage() {
            return "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), "
                    + "gmt_modified = ? WHERE tenant_id = ?";
        }
    
    
        public String getCapacityList4CorrectUsage() {
            return "SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ?";
        }
    
    
        public String insertTenantCapacity() {
            return "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, "
                    + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;";
        }
    
    
        public String getTableName() {
            return TableConstant.TENANT_CAPACITY;
        }
    
    
    }
    View Code
       3.2.8.AbstractConfigInfoMapperCommon
    package com.alibaba.nacos.plugin.datasource.impl.common;
    
    import com.alibaba.nacos.common.utils.CollectionUtils;
    import com.alibaba.nacos.common.utils.StringUtils;
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoMapper;
    
    import java.sql.Timestamp;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    
    public abstract class AbstractConfigInfoMapperCommon extends AbstractMapper implements ConfigInfoMapper {
    
        private static final String DATA_ID = "dataId";
    
        private static final String GROUP = "group";
    
        private static final String APP_NAME = "appName";
    
        private static final String CONTENT = "content";
    
        private static final String TENANT = "tenant";
    
        public String findConfigMaxId() {
            return "SELECT MAX(id) FROM config_info";
        }
    
        public String findAllDataIdAndGroup() {
            return "SELECT DISTINCT data_id, group_id FROM config_info";
        }
    
        public String findConfigInfoByAppCountRows() {
            return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ? AND app_name= ?";
        }
    
        public String findConfigInfoByAppFetchRows(int startRow, int pageSize) {
            return "SELECT id,data_id,group_id,tenant_id,app_name,content FROM config_info"
                    + " WHERE tenant_id LIKE ? AND app_name= ?" + " LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
        public String configInfoLikeTenantCount() {
            return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ?";
        }
    
        public String getTenantIdList(int startRow, int pageSize) {
            return "SELECT tenant_id FROM config_info WHERE tenant_id != '' GROUP BY tenant_id LIMIT " + pageSize
                    + " OFFSET " + startRow;
        }
    
        public String getGroupIdList(int startRow, int pageSize) {
            return "SELECT group_id FROM config_info WHERE tenant_id ='' GROUP BY group_id LIMIT " + pageSize + " OFFSET "
                    + startRow;
        }
    
        public String findAllConfigKey(int startRow, int pageSize) {
            return " SELECT data_id,group_id,app_name  FROM ( "
                    + " SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id LIMIT " + pageSize + " OFFSET "
                    + startRow + " )" + " g, config_info t WHERE g.id = t.id  ";
        }
    
        public String findAllConfigInfoBaseFetchRows(int startRow, int pageSize) {
            return "SELECT t.id,data_id,group_id,content,md5"
                    + " FROM ( SELECT id FROM config_info ORDER BY id LIMIT ?,?  ) "
                    + " g, config_info t  WHERE g.id = t.id ";
        }
    
        public String findAllConfigInfoFragment(int startRow, int pageSize) {
            return "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 LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
        public String findChangeConfig() {
            return "SELECT data_id, group_id, tenant_id, app_name, content, gmt_modified,encrypted_data_key "
                    + "FROM config_info WHERE gmt_modified >= ? AND gmt_modified <= ?";
        }
    
        public String findChangeConfigCountRows(Map params, final Timestamp startTime,
                                                final Timestamp endTime) {
            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;
            final String sqlCountRows = "SELECT count(*) FROM config_info WHERE ";
            String where = " 1=1 ";
            if (!StringUtils.isBlank(dataId)) {
                where += " AND data_id LIKE ? ";
            }
            if (!StringUtils.isBlank(group)) {
                where += " AND group_id LIKE ? ";
            }
    
            if (!StringUtils.isBlank(tenantTmp)) {
                where += " AND tenant_id = ? ";
            }
    
            if (!StringUtils.isBlank(appName)) {
                where += " AND app_name = ? ";
            }
            if (startTime != null) {
                where += " AND gmt_modified >=? ";
            }
            if (endTime != null) {
                where += " AND gmt_modified <=? ";
            }
            return sqlCountRows + where;
        }
    
    
        public String findChangeConfigFetchRows(Map 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;
            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 ? ";
            }
            if (!StringUtils.isBlank(group)) {
                where += " AND group_id LIKE ? ";
            }
    
            if (!StringUtils.isBlank(tenantTmp)) {
                where += " AND tenant_id = ? ";
            }
    
            if (!StringUtils.isBlank(appName)) {
                where += " AND app_name = ? ";
            }
            if (startTime != null) {
                where += " AND gmt_modified >=? ";
            }
            if (endTime != null) {
                where += " AND gmt_modified <=? ";
            }
            return sqlFetchRows + where + " AND id > " + lastMaxId + " ORDER BY id ASC" + " LIMIT " + 0 + " OFFSET "
                    + pageSize;
        }
    
    
        public String listGroupKeyMd5ByPageFetchRows(int startRow, int pageSize) {
            return "SELECT t.id,data_id,group_id,tenant_id,app_name,md5,type,gmt_modified,encrypted_data_key FROM "
                    + "( SELECT id FROM config_info ORDER BY id LIMIT " + pageSize + " OFFSET " + startRow
                    + " ) g, config_info t WHERE g.id = t.id";
        }
    
    
        public String findAllConfigInfo4Export(List ids, Map params) {
            String tenant = params.get("tenant");
            String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;
            String sql = "SELECT id,data_id,group_id,tenant_id,app_name,content,type,md5,gmt_create,gmt_modified,src_user,src_ip,"
                    + "c_desc,c_use,effect,c_schema,encrypted_data_key FROM config_info";
            StringBuilder where = new StringBuilder(" WHERE ");
            List paramList = new ArrayList<>();
            if (!CollectionUtils.isEmpty(ids)) {
                where.append(" id IN (");
                for (int i = 0; i < ids.size(); i++) {
                    if (i != 0) {
                        where.append(", ");
                    }
                    where.append('?');
                    paramList.add(ids.get(i));
                }
                where.append(") ");
            } else {
                where.append(" tenant_id= ? ");
                paramList.add(tenantTmp);
                if (!StringUtils.isBlank(params.get(DATA_ID))) {
                    where.append(" AND data_id LIKE ? ");
                }
                if (StringUtils.isNotBlank(params.get(GROUP))) {
                    where.append(" AND group_id= ? ");
                }
                if (StringUtils.isNotBlank(params.get(APP_NAME))) {
                    where.append(" AND app_name= ? ");
                }
            }
            return sql + where;
        }
    
    
        public String findConfigInfoBaseLikeCountRows(Map params) {
            final String sqlCountRows = "SELECT count(*) FROM config_info WHERE ";
            String where = " 1=1 AND tenant_id='' ";
    
            if (!StringUtils.isBlank(params.get(DATA_ID))) {
                where += " AND data_id LIKE ? ";
            }
            if (!StringUtils.isBlank(params.get(GROUP))) {
                where += " AND group_id LIKE ";
            }
            if (!StringUtils.isBlank(params.get(CONTENT))) {
                where += " AND content LIKE ? ";
            }
            return sqlCountRows + where;
        }
    
    
        public String findConfigInfoBaseLikeFetchRows(Map params, int startRow, int pageSize) {
            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(params.get(DATA_ID))) {
                where += " AND data_id LIKE ? ";
            }
            if (!StringUtils.isBlank(params.get(GROUP))) {
                where += " AND group_id LIKE ";
            }
            if (!StringUtils.isBlank(params.get(CONTENT))) {
                where += " AND content LIKE ? ";
            }
            return sqlFetchRows + where + " LIMIT " + startRow + "," + pageSize;
        }
    
    
        public String findConfigInfo4PageCountRows(Map params) {
            final String appName = params.get(APP_NAME);
            final String dataId = params.get(DATA_ID);
            final String group = params.get(GROUP);
            final String sqlCount = "SELECT count(*) FROM config_info";
            StringBuilder where = new StringBuilder(" WHERE ");
            where.append(" tenant_id=? ");
            if (StringUtils.isNotBlank(dataId)) {
                where.append(" AND data_id=? ");
            }
            if (StringUtils.isNotBlank(group)) {
                where.append(" AND group_id=? ");
            }
            if (StringUtils.isNotBlank(appName)) {
                where.append(" AND app_name=? ");
            }
            return sqlCount + where;
        }
    
    
        public String findConfigInfo4PageFetchRows(Map 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 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=? ");
            }
            if (StringUtils.isNotBlank(group)) {
                where.append(" AND group_id=? ");
            }
            if (StringUtils.isNotBlank(appName)) {
                where.append(" AND app_name=? ");
            }
            return sql + where + " LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
    
        public String findConfigInfoBaseByGroupFetchRows(int startRow, int pageSize) {
            return "SELECT id,data_id,group_id,content FROM config_info WHERE group_id=? AND tenant_id=?" + " LIMIT "
                    + pageSize + " OFFSET " + startRow;
        }
    
    
        public String findConfigInfoLike4PageCountRows(Map params) {
            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 sqlCountRows = "SELECT count(*) FROM config_info";
            StringBuilder where = new StringBuilder(" WHERE ");
            where.append(" tenant_id LIKE ? ");
            if (!StringUtils.isBlank(dataId)) {
                where.append(" AND data_id LIKE ? ");
            }
            if (!StringUtils.isBlank(group)) {
                where.append(" AND group_id LIKE ? ");
            }
            if (!StringUtils.isBlank(appName)) {
                where.append(" AND app_name = ? ");
            }
            if (!StringUtils.isBlank(content)) {
                where.append(" AND content LIKE ? ");
            }
            return sqlCountRows + where;
        }
    
    
        public String findConfigInfoLike4PageFetchRows(Map 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 ? ");
            if (!StringUtils.isBlank(dataId)) {
                where.append(" AND data_id LIKE ? ");
            }
            if (!StringUtils.isBlank(group)) {
                where.append(" AND group_id LIKE ? ");
            }
            if (!StringUtils.isBlank(appName)) {
                where.append(" AND app_name = ? ");
            }
            if (!StringUtils.isBlank(content)) {
                where.append(" AND content LIKE ? ");
            }
            return sqlFetchRows + where + " LIMIT " + pageSize + " OFFSET " + startRow;
        }
    
    
        public String findAllConfigInfoFetchRows(int startRow, int pageSize) {
            return "SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5 "
                    + " FROM (  SELECT id FROM config_info WHERE tenant_id LIKE ? ORDER BY id LIMIT " + pageSize
                    + " OFFSET " + startRow + " )" + " g, config_info t  WHERE g.id = t.id ";
        }
    
    
        public String findConfigInfosByIds(int idSize) {
            StringBuilder sql = new StringBuilder(
                    "SELECT ID,data_id,group_id,tenant_id,app_name,content,md5 FROM config_info WHERE ");
            sql.append("id IN (");
            for (int i = 0; i < idSize; i++) {
                if (i != 0) {
                    sql.append(", ");
                }
                sql.append('?');
            }
            sql.append(") ");
            return sql.toString();
        }
    
    
        public String removeConfigInfoByIdsAtomic(int size) {
            StringBuilder sql = new StringBuilder("DELETE FROM config_info WHERE ");
            sql.append("id IN (");
            for (int i = 0; i < size; i++) {
                if (i != 0) {
                    sql.append(", ");
                }
                sql.append('?');
            }
            sql.append(") ");
            return sql.toString();
        }
    
    
        public String updateConfigInfoAtomicCas() {
            return "UPDATE config_info SET "
                    + "content=?, md5 = ?, src_ip=?,src_user=?,gmt_modified=?, app_name=?,c_desc=?,c_use=?,effect=?,type=?,c_schema=? "
                    + "WHERE data_id=? AND group_id=? AND tenant_id=? AND (md5=? OR md5 IS NULL OR md5='')";
        }
    
    
        public String getTableName() {
            return TableConstant.CONFIG_INFO;
        }
    
    
    }
    
    View Code
    

      3.3.达梦数据源适配实现

       3.3.1.ConfigInfoAggrMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoAggrMapperCommon;
    
    
    public class ConfigInfoAggrMapperByDM extends AbstractConfigInfoAggrMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.2.ConfigInfoBetaMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoBetaMapperCommon;
    
    public class ConfigInfoBetaMapperByDM extends AbstractConfigInfoBetaMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.3.ConfigInfoMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoMapperCommon;
    
    public class ConfigInfoMapperByDM extends AbstractConfigInfoMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.4.ConfigInfoTagMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigInfoTagMapperCommon;
    
    public class ConfigInfoTagMapperByDM extends AbstractConfigInfoTagMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.5.ConfigTagsRelationMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractConfigTagsRelationMapperCommon;
    
    public class ConfigTagsRelationMapperByDM extends AbstractConfigTagsRelationMapperCommon {
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.6.GroupCapacityMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractGroupCapacityMapperCommon;
    
    public class GroupCapacityMapperByDM extends AbstractGroupCapacityMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.7.HistoryConfigInfoMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractHistoryConfigInfoMapperCommon;
    
    public class HistoryConfigInfoMapperByDM extends AbstractHistoryConfigInfoMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.8.TenantCapacityMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.impl.common.AbstractTenantCapacityMapperCommon;
    
    public class TenantCapacityMapperByDM extends AbstractTenantCapacityMapperCommon {
    
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    }
    View Code
       3.3.9.TenantInfoMapperByDM
    package com.alibaba.nacos.plugin.datasource.impl.dm;
    
    import com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant;
    import com.alibaba.nacos.plugin.datasource.constants.TableConstant;
    import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
    import com.alibaba.nacos.plugin.datasource.mapper.TenantInfoMapper;
    
    public class TenantInfoMapperByDM  extends AbstractMapper implements TenantInfoMapper {
    
        @Override
        public String getTableName() {
            return TableConstant.TENANT_INFO;
        }
    
        @Override
        public String getDataSource() {
            return DataSourceConstant.DM;
        }
    
    }
    View Code

      3.4.其他数据源适配实现

      跟上面达梦数据源适配实现一致,只需将 getDataSource 方法替换成对应的数据源类型就OK;

      3.5.DDL

      3.5.1.达梦数据库
    CREATE SCHEMA nacos AUTHORIZATION nacos;
    CREATE TABLE config_info (
      id bigint NOT NULL identity,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content CLOB,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128) DEFAULT NULL,
      src_ip varchar(20) DEFAULT NULL,
      c_desc varchar(256) DEFAULT NULL,
      c_use varchar(64) DEFAULT NULL,
      effect varchar(64) DEFAULT NULL,
      type varchar(64) DEFAULT NULL,
      c_schema text DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint configinfo_id_key PRIMARY KEY (id),
      constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
     
    CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
    CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
    CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);
      
    CREATE TABLE his_config_info (
      id bigint NOT NULL,
      nid bigint NOT NULL identity,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content CLOB,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      op_type char(10) DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint hisconfiginfo_nid_key PRIMARY KEY (nid));
    
    
    CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id);
    CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create);
    CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified);  
    
    CREATE TABLE config_info_beta (
      id bigint NOT NULL identity,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content CLOB,
      beta_ips varchar(1024),
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfobeta_id_key PRIMARY KEY (id),
      constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
    
    CREATE TABLE config_info_tag (
      id bigint NOT NULL identity,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      tag_id varchar(128) NOT NULL,
      app_name varchar(128),
      content CLOB,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfotag_id_key PRIMARY KEY (id),
      constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));
    
    
    CREATE TABLE config_info_aggr (
      id bigint NOT NULL identity,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      datum_id varchar(255) NOT NULL,
      app_name varchar(128),
      content CLOB,
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      constraint configinfoaggr_id_key PRIMARY KEY (id),
      constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id));
    
    CREATE TABLE app_list (
     id bigint NOT NULL identity,
     app_name varchar(128) NOT NULL,
     is_dynamic_collect_disabled smallint DEFAULT 0,
     last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     sub_info_lock_owner varchar(128),
     sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     constraint applist_id_key PRIMARY KEY (id),
     constraint uk_appname UNIQUE (app_name));
    
    CREATE TABLE app_configdata_relation_subs (
      id bigint NOT NULL identity,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationsubs_id_key PRIMARY KEY (id),
      constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id));
    
    
    CREATE TABLE app_configdata_relation_pubs (
      id bigint NOT NULL identity,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationpubs_id_key PRIMARY KEY (id),
      constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id));
    
    CREATE TABLE config_tags_relation (
      id bigint NOT NULL,
      tag_name varchar(128) NOT NULL,
      tag_type varchar(64) DEFAULT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) DEFAULT '',
      nid bigint NOT NULL  identity,
      constraint config_tags_id_key PRIMARY KEY (nid),
      constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type));
    
    CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id);
    
    CREATE TABLE group_capacity (
      id bigint NOT NULL  identity,
      group_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint group_capacity_id_key PRIMARY KEY (id),
      constraint uk_group_id UNIQUE (group_id));
    
    CREATE TABLE tenant_capacity (
      id bigint NOT NULL identity,
      tenant_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint tenant_capacity_id_key PRIMARY KEY (id),
      constraint uk_tenant_id UNIQUE (tenant_id));
    
    CREATE TABLE tenant_info (
      id bigint NOT NULL identity,
      kp varchar(128) NOT NULL,
      tenant_id varchar(128)  DEFAULT '',
      tenant_name varchar(128)  DEFAULT '',
      tenant_desc varchar(256)  DEFAULT NULL,
      create_source varchar(32) DEFAULT NULL,
      gmt_create bigint NOT NULL,
      gmt_modified bigint NOT NULL,
      constraint tenant_info_id_key PRIMARY KEY (id),
      constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id));
    CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id);
    
    CREATE TABLE users (
        username varchar(50) NOT NULL PRIMARY KEY,
        password varchar(500) NOT NULL,
        enabled bit NOT NULL
    );
    
    CREATE TABLE roles (
        username varchar(50) NOT NULL,
        role varchar(50) NOT NULL
    );
    
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);
    
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
    View Code
      3.5.2.瀚高数据库
    CREATE SCHEMA nacos AUTHORIZATION nacos;
    CREATE TABLE config_info (
      id bigint NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128) DEFAULT NULL,
      src_ip varchar(20) DEFAULT NULL,
      c_desc varchar(256) DEFAULT NULL,
      c_use varchar(64) DEFAULT NULL,
      effect varchar(64) DEFAULT NULL,
      type varchar(64) DEFAULT NULL,
      c_schema text DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint configinfo_id_key PRIMARY KEY (id),
      constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
    
    CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
    CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
    CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);
    CREATE SEQUENCE config_info_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info  alter column id set default nextval('config_info_id_seq'); 
    
    
    
    CREATE TABLE his_config_info (
      id bigint NOT NULL,
      nid bigint NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      op_type char(10) DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint hisconfiginfo_nid_key PRIMARY KEY (nid));
    
    
    CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id);
    CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create);
    CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified);  
    
    CREATE SEQUENCE his_config_info_nid_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table his_config_info  alter column nid set default nextval('his_config_info_nid_seq'); 
    
    
    CREATE TABLE config_info_beta (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      beta_ips varchar(1024),
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfobeta_id_key PRIMARY KEY (id),
      constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
    
    CREATE SEQUENCE config_info_beta_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_beta  alter column id set default nextval('config_info_beta_id_seq'); 
    
    
    CREATE TABLE config_info_tag (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      tag_id varchar(128) NOT NULL,
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfotag_id_key PRIMARY KEY (id),
      constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));
    CREATE SEQUENCE config_info_tag_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_tag  alter column id set default nextval('config_info_tag_id_seq'); 
    
    
    
    CREATE TABLE config_info_aggr (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      datum_id varchar(255) NOT NULL,
      app_name varchar(128),
      content text,
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      constraint configinfoaggr_id_key PRIMARY KEY (id),
      constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id));
    
    CREATE SEQUENCE config_info_aggr_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_aggr  alter column id set default nextval('config_info_aggr_id_seq'); 
    
    
    CREATE TABLE app_list (
     id bigint NOT NULL ,
     app_name varchar(128) NOT NULL,
     is_dynamic_collect_disabled smallint DEFAULT 0,
     last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     sub_info_lock_owner varchar(128),
     sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     constraint applist_id_key PRIMARY KEY (id),
     constraint uk_appname UNIQUE (app_name));
    CREATE SEQUENCE app_list_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_list  alter column id set default nextval('app_list_id_seq'); 
    
    
    CREATE TABLE app_configdata_relation_subs (
      id bigint NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationsubs_id_key PRIMARY KEY (id),
      constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id));
    CREATE SEQUENCE app_configdata_relation_subs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_configdata_relation_subs  alter column id set default nextval('app_configdata_relation_subs_id_seq'); 
    
    
    
    CREATE TABLE app_configdata_relation_pubs (
      id bigint NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationpubs_id_key PRIMARY KEY (id),
      constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id));
    CREATE SEQUENCE app_configdata_relation_pubs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_configdata_relation_pubs  alter column id set default nextval('app_configdata_relation_pubs_id_seq'); 
    
    
    CREATE TABLE config_tags_relation (
      id bigint NOT NULL,
      tag_name varchar(128) NOT NULL,
      tag_type varchar(64) DEFAULT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) DEFAULT '',
      nid bigint NOT NULL,
      constraint config_tags_id_key PRIMARY KEY (nid),
      constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type));
    
    CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id);
    CREATE SEQUENCE config_tags_relation_pubs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_tags_relation  alter column id set default nextval('config_tags_relation_pubs_id_seq'); 
    
    
    
    CREATE TABLE group_capacity (
      id bigint NOT NULL ,
      group_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint group_capacity_id_key PRIMARY KEY (id),
      constraint uk_group_id UNIQUE (group_id));
    CREATE SEQUENCE group_capacity_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table group_capacity  alter column id set default nextval('group_capacity_id_seq'); 
    
    
    CREATE TABLE tenant_capacity (
      id bigint NOT NULL ,
      tenant_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint tenant_capacity_id_key PRIMARY KEY (id),
      constraint uk_tenant_id UNIQUE (tenant_id));
    CREATE SEQUENCE tenant_capacity_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table tenant_capacity  alter column id set default nextval('tenant_capacity_id_seq'); 
    
    
    CREATE TABLE tenant_info (
      id bigint NOT NULL ,
      kp varchar(128) NOT NULL,
      tenant_id varchar(128)  DEFAULT '',
      tenant_name varchar(128)  DEFAULT '',
      tenant_desc varchar(256)  DEFAULT NULL,
      create_source varchar(32) DEFAULT NULL,
      gmt_create bigint NOT NULL,
      gmt_modified bigint NOT NULL,
      constraint tenant_info_id_key PRIMARY KEY (id),
      constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id));
    CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id);
    
    CREATE SEQUENCE tenant_info_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table tenant_info  alter column id set default nextval('tenant_info_id_seq'); 
    
    
    
    CREATE TABLE users (
        username varchar(50) NOT NULL PRIMARY KEY,
        password varchar(500) NOT NULL,
        enabled boolean NOT NULL
    );
    
    CREATE TABLE roles (
        username varchar(50) NOT NULL,
        role varchar(50) NOT NULL
    );
    
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', true);
    
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
    View Code
      3.5.3.人大金仓数据库
    CREATE SCHEMA nacos AUTHORIZATION nacos;
    CREATE TABLE config_info (
      id bigint NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128) DEFAULT NULL,
      src_ip varchar(20) DEFAULT NULL,
      c_desc varchar(256) DEFAULT NULL,
      c_use varchar(64) DEFAULT NULL,
      effect varchar(64) DEFAULT NULL,
      type varchar(64) DEFAULT NULL,
      c_schema text DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint configinfo_id_key PRIMARY KEY (id),
      constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
    
    CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
    CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
    CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);
    CREATE SEQUENCE config_info_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info  alter column id set default nextval('config_info_id_seq'); 
    
    
    
    CREATE TABLE his_config_info (
      id bigint NOT NULL,
      nid bigint NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      op_type char(10) DEFAULT NULL,
      ENCRYPTED_DATA_KEY varchar(100) DEFAULT NULL,
      constraint hisconfiginfo_nid_key PRIMARY KEY (nid));
    
    
    CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id);
    CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create);
    CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified);  
    
    CREATE SEQUENCE his_config_info_nid_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table his_config_info  alter column nid set default nextval('his_config_info_nid_seq'); 
    
    
    CREATE TABLE config_info_beta (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      app_name varchar(128),
      content text,
      beta_ips varchar(1024),
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfobeta_id_key PRIMARY KEY (id),
      constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
    
    CREATE SEQUENCE config_info_beta_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_beta  alter column id set default nextval('config_info_beta_id_seq'); 
    
    
    CREATE TABLE config_info_tag (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      tag_id varchar(128) NOT NULL,
      app_name varchar(128),
      content text,
      md5 varchar(32) DEFAULT NULL,
      gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      src_user varchar(128),
      src_ip varchar(20) DEFAULT NULL,
      constraint configinfotag_id_key PRIMARY KEY (id),
      constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));
    CREATE SEQUENCE config_info_tag_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_tag  alter column id set default nextval('config_info_tag_id_seq'); 
    
    
    
    CREATE TABLE config_info_aggr (
      id bigint NOT NULL ,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) default '',
      datum_id varchar(255) NOT NULL,
      app_name varchar(128),
      content text,
      gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
      constraint configinfoaggr_id_key PRIMARY KEY (id),
      constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id));
    
    CREATE SEQUENCE config_info_aggr_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_info_aggr  alter column id set default nextval('config_info_aggr_id_seq'); 
    
    
    CREATE TABLE app_list (
     id bigint NOT NULL ,
     app_name varchar(128) NOT NULL,
     is_dynamic_collect_disabled smallint DEFAULT 0,
     last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     sub_info_lock_owner varchar(128),
     sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0',
     constraint applist_id_key PRIMARY KEY (id),
     constraint uk_appname UNIQUE (app_name));
    CREATE SEQUENCE app_list_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_list  alter column id set default nextval('app_list_id_seq'); 
    
    
    CREATE TABLE app_configdata_relation_subs (
      id bigint NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationsubs_id_key PRIMARY KEY (id),
      constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id));
    CREATE SEQUENCE app_configdata_relation_subs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_configdata_relation_subs  alter column id set default nextval('app_configdata_relation_subs_id_seq'); 
    
    
    
    CREATE TABLE app_configdata_relation_pubs (
      id bigint NOT NULL ,
      app_name varchar(128) NOT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint configdatarelationpubs_id_key PRIMARY KEY (id),
      constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id));
    CREATE SEQUENCE app_configdata_relation_pubs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table app_configdata_relation_pubs  alter column id set default nextval('app_configdata_relation_pubs_id_seq'); 
    
    
    CREATE TABLE config_tags_relation (
      id bigint NOT NULL,
      tag_name varchar(128) NOT NULL,
      tag_type varchar(64) DEFAULT NULL,
      data_id varchar(255) NOT NULL,
      group_id varchar(128) NOT NULL,
      tenant_id varchar(128) DEFAULT '',
      nid bigint NOT NULL,
      constraint config_tags_id_key PRIMARY KEY (nid),
      constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type));
    
    CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id);
    CREATE SEQUENCE config_tags_relation_pubs_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table config_tags_relation  alter column id set default nextval('config_tags_relation_pubs_id_seq'); 
    
    
    
    CREATE TABLE group_capacity (
      id bigint NOT NULL ,
      group_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint group_capacity_id_key PRIMARY KEY (id),
      constraint uk_group_id UNIQUE (group_id));
    CREATE SEQUENCE group_capacity_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table group_capacity  alter column id set default nextval('group_capacity_id_seq'); 
    
    
    CREATE TABLE tenant_capacity (
      id bigint NOT NULL ,
      tenant_id varchar(128) DEFAULT '',
      quota int DEFAULT 0,
      usage int DEFAULT 0,
      max_size int DEFAULT 0,
      max_aggr_count int DEFAULT 0,
      max_aggr_size int DEFAULT 0,
      max_history_count int DEFAULT 0,
      gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
      gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
      constraint tenant_capacity_id_key PRIMARY KEY (id),
      constraint uk_tenant_id UNIQUE (tenant_id));
    CREATE SEQUENCE tenant_capacity_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table tenant_capacity  alter column id set default nextval('tenant_capacity_id_seq'); 
    
    
    CREATE TABLE tenant_info (
      id bigint NOT NULL ,
      kp varchar(128) NOT NULL,
      tenant_id varchar(128)  DEFAULT '',
      tenant_name varchar(128)  DEFAULT '',
      tenant_desc varchar(256)  DEFAULT NULL,
      create_source varchar(32) DEFAULT NULL,
      gmt_create bigint NOT NULL,
      gmt_modified bigint NOT NULL,
      constraint tenant_info_id_key PRIMARY KEY (id),
      constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id));
    CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id);
    
    CREATE SEQUENCE tenant_info_id_seq 
        START WITH 1    
        INCREMENT BY 1  
        NO MINVALUE 
        NO MAXVALUE 
        CACHE 1; 
    alter table tenant_info  alter column id set default nextval('tenant_info_id_seq'); 
    
    
    
    CREATE TABLE users (
        username varchar(50) NOT NULL PRIMARY KEY,
        password varchar(500) NOT NULL,
        enabled boolean NOT NULL
    );
    
    CREATE TABLE roles (
        username varchar(50) NOT NULL,
        role varchar(50) NOT NULL
    );
    
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', true);
    
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
    View Code

      ps:达梦、瀚高数据源下修改配置管理的配置列表信息因为config_info的唯一外键uk_configinfo_datagrouptenant导致发布失败,因为sqlState不一致导致获取的异常是DataIntegrityViolationException,导致捕获异常失败,更新失败;

      pps: 其他数据源异常进入的是SQLErrorCodeSQLExceptionTranslator

      ppps:从下面的SQLErrorCodes和sql-error-codes.xml可以看出各个SQL返回码对应的异常bean,从SQLErrorCodesFactory#SQLErrorCodesFactory可以看出我们可以自定义这个xml来解决上面的问题

       自定义xml: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">
    
    <beans>
        <bean id="dm" class="org.springframework.jdbc.support.SQLErrorCodes">
            <property name="useSqlStateForTranslation">
                <value>truevalue>
            property>
            <property name="databaseProductNames">
                <list>
                    <value>DM DBMSvalue>
                list>
            property>
            <property name="duplicateKeyCodes">
                <value>23000value>
            property>
        bean>
        <bean id="KingbaseES" class="org.springframework.jdbc.support.SQLErrorCodes">
            <property name="useSqlStateForTranslation">
                <value>truevalue>
            property>
            <property name="databaseProductNames">
                <list>
                    <value>KingbaseESvalue>
                list>
            property>
            <property name="duplicateKeyCodes">
                <value>23505value>
            property>
        bean>
    beans>
    复制代码

      3.6.service文件

      在resources下面创建resources/META-INF/services/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.GroupCapacityMapperByDM
    com.alibaba.nacos.plugin.datasource.impl.dm.HistoryConfigInfoMapperByDM
    com.alibaba.nacos.plugin.datasource.impl.dm.TenantCapacityMapperByDM
    com.alibaba.nacos.plugin.datasource.impl.dm.TenantInfoMapperByDM
    
    #其他类似..............
    View Code

       3.7.nacos-server配置

      1)mvn install后该jar包和数据源驱动jar包放入到Nacos(版本2.2.0才支持数据源插件化)的plugins目录下(没有则新建),Nacos的启动脚本startup.sh中-Dloader.path参数将会加载外部jar包文件到Nacos的环境中;

      ps:plugins存放的是普通jar,而不是fatjar(包含依赖),可能因为fatjar的目录结构不一样导致读取Mapper实现类失败,报找不到实现类导致启动失败;

      2)修改Nacos的conf/application.properties,增加对应数据源的连接参数信息:

    db.num=1
    #指定数据源类型,对应DataSourceConstant参数
    spring.sql.init.platform=dm
    db.url.0=jdbc:dm://ip:5236/
    db.user.0=username
    db.password.0=password
    #指定driver
    db.pool.config.driverClassName=dm.jdbc.driver.DmDriver
    View Code

      ps: Oracle必须指定配置  “db.pool.config.connectionTestQuery=select 1 from dual”,不然报  “org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字”;

      3.8.启动

      1)启动命令:

       单机模式:sudo sh startup.sh -m standalone

      集群模式:./startup.sh

      PS:

      集群模式下修改cluster.conf.example文件为cluster.conf,不然报错误: Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net

      2)ip访问验证:http://ip:8848/nacos/index.html

    二.源码探究

      1.准备

      源码nacos-2.2.0:https://github.com/alibaba/nacos.git

      2.网页入口

      nacos-console模块com.alibaba.nacos.Nacos

      3.nacos数据持久化入口

       3.1.com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl#init()

        @PostConstruct
        public void init() {
            //获取数据源
            dataSourceService = DynamicDataSource.getInstance().getDataSource();
            
            jt = getJdbcTemplate();
            tjt = getTransactionTemplate();
            Boolean isDataSourceLogEnable = EnvUtil
                    .getProperty(Constants.NACOS_PLUGIN_DATASOURCE_LOG, Boolean.class, false);
            mapperManager = MapperManager.instance(isDataSourceLogEnable);
        }
        
        com.alibaba.nacos.config.server.service.datasource.DynamicDataSource#getDataSource
            public synchronized DataSourceService getDataSource() {
            try {
                
                // Embedded storage is used by default in stand-alone mode
                // In cluster mode, external databases are used by default
                //单机模式
                if (PropertyUtil.isEmbeddedStorage()) {
                    if (localDataSourceService == null) {
                        localDataSourceService = new LocalDataSourceServiceImpl();
                        localDataSourceService.init();
                    }
                    return localDataSourceService;
                } else {
                    //集群模式
                    if (basicDataSourceService == null) {
                        basicDataSourceService = new ExternalDataSourceServiceImpl();
                        basicDataSourceService.init();
                    }
                    return basicDataSourceService;
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    View Code

       3.2.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl#init

            @Override
        public void init() {
            queryTimeout = ConvertUtils.toInt(System.getProperty("QUERYTIMEOUT"), 3);
            jt = new JdbcTemplate();
            // Set the maximum number of records to prevent memory expansion
            jt.setMaxRows(50000);
            jt.setQueryTimeout(queryTimeout);
    
            testMasterJT = new JdbcTemplate();
            testMasterJT.setQueryTimeout(queryTimeout);
    
            testMasterWritableJT = new JdbcTemplate();
            // Prevent the login interface from being too long because the main library is not available
            testMasterWritableJT.setQueryTimeout(1);
    
            //  Database health check
    
            testJtList = new ArrayList<>();
            isHealthList = new ArrayList<>();
    
            tm = new DataSourceTransactionManager();
            tjt = new TransactionTemplate(tm);
    
            // Transaction timeout needs to be distinguished from ordinary operations.
            tjt.setTimeout(TRANSACTION_QUERY_TIMEOUT);
            //获取数据源类型:spring.sql.init.platform或spring.datasource.platform指定的参数值
            dataSourceType = DatasourcePlatformUtil.getDatasourcePlatform(defaultDataSourceType);
    
            if (PropertyUtil.isUseExternalDB()) {
                try {
                    //加载数据源连接
                    reload();
                } catch (IOException e) {
                    FATAL_LOG.error("[ExternalDataSourceService] datasource reload error", e);
                    throw new RuntimeException(DB_LOAD_ERROR_MSG, e);
                }
    
                if (this.dataSourceList.size() > DB_MASTER_SELECT_THRESHOLD) {
                    ConfigExecutor.scheduleConfigTask(new SelectMasterTask(), 10, 10, TimeUnit.SECONDS);
                }
                ConfigExecutor.scheduleConfigTask(new CheckDbHealthTask(), 10, 10, TimeUnit.SECONDS);
            }
        }
    View Code

       3.3.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl#reload

    @Override
        public synchronized void reload() throws IOException {
            try {
                final List testJtListNew = new ArrayList();
                final List isHealthListNew = new ArrayList();
                //com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties#build:获取数据源
                List dataSourceListNew = new ExternalDataSourceProperties()
                        .build(EnvUtil.getEnvironment(), (dataSource) -> {
                            JdbcTemplate jdbcTemplate = new JdbcTemplate();
                            jdbcTemplate.setQueryTimeout(queryTimeout);
                            jdbcTemplate.setDataSource(dataSource);
                            testJtListNew.add(jdbcTemplate);
                            isHealthListNew.add(Boolean.TRUE);
                        });
                final List dataSourceListOld = dataSourceList;
                final List testJtListOld = testJtList;
                dataSourceList = dataSourceListNew;
                testJtList = testJtListNew;
                isHealthList = isHealthListNew;
                //选择主数据源:测试数据源,数据源设置到JdbcTemplate jt中(重点,后续请求从jt中获取dataSource)
                new SelectMasterTask().run();
                //校验数据源的状态
                new CheckDbHealthTask().run();
    
                //close old datasource.
                if (dataSourceListOld != null && !dataSourceListOld.isEmpty()) {
                    for (HikariDataSource dataSource : dataSourceListOld) {
                        dataSource.close();
                    }
                }
                if (testJtListOld != null && !testJtListOld.isEmpty()) {
                    for (JdbcTemplate oldJdbc : testJtListOld) {
                        oldJdbc.setDataSource(null);
                    }
                }
            } catch (RuntimeException e) {
                FATAL_LOG.error(DB_LOAD_ERROR_MSG, e);
                throw new IOException(e);
            }
        }
    View Code

       3.4.com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties#build:根据application.properties配置连接获取数据源

        List build(Environment environment, Callback callback) {
            List 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");
            for (int index = 0; index < num; index++) {
                int currentSize = index + 1;
                Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);
                //获取driverClassName
                DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);
                if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {
                    poolProperties.setDriverClassName(JDBC_DRIVER_NAME);
                }
                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(TEST_QUERY);
                }
                dataSources.add(ds);
                callback.accept(ds);
            }
            Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");
            return dataSources;
        }
    View Code

       3.5.com.alibaba.nacos.config.server.service.datasource.DataSourcePoolProperties#build

            public static DataSourcePoolProperties build(Environment environment) {
            DataSourcePoolProperties result = new DataSourcePoolProperties();
            //绑定driverClassName值
            Binder.get(environment).bind("db.pool.config", Bindable.ofInstance(result.getDataSource()));
            return result;
        }
    View Code

       3.6.com.alibaba.nacos.plugin.datasource.MapperManager#loadInitial:nacos-datasource-plugin

        public void loadInitial() {
            //spi加载插件实现类
            Collection mappers = NacosServiceLoader.load(Mapper.class);
            for (Mapper mapper : mappers) {
                Map mapperMap = MAPPER_SPI_MAP.getOrDefault(mapper.getDataSource(), new HashMap<>(16));
                mapperMap.put(mapper.getTableName(), mapper);
                MAPPER_SPI_MAP.put(mapper.getDataSource(), mapperMap);
                LOGGER.info("[MapperManager] Load Mapper({}) datasource({}) tableName({}) successfully.",
                        mapper.getClass(), mapper.getDataSource(), mapper.getTableName());
            }
        }
    View Code

      ps:

      SPI:Service Provider Interface (服务提供接口) 是java提供的一套用来被第三方实现或扩展的接口。它可以用来启用框架 扩展和替换 组件;

      SPI 与API 区别与联系

        API: (Application Programming Interface) 在绝大多数情况下,都是实现方定制接口并进行接口的实现,调用者只能选择调用,而无权选择不同实现;

        SPI: 调用方制定接口规范,提供给外部实现。调用方在调用时选择自己需要的外部实现;

      流程:

      1)定义一个接口,定义接口的实现类;

      2)在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名;

       3)通过serviceLoader加载实现类并调用

    复制代码
      public static void main(String[] args) {
             ServiceLoader mappers = ServiceLoader.load(Mapper.class);
             for (Mapper m : mappers) {
                 m.getTableName();
             }
         }
    复制代码

       pps:在 ServiceLoader.load 后遍历 mappers 时可以通过 BeanDefinitionRegistry 可以将mapper实现类注册到 ApplicationContext中,这样就可以对接口实现类使用 @Autowired 来解决依赖注入问题了;

       3.7.com.alibaba.nacos.config.server.service.dump.ExternalDumpService#init:将数据库的config_info信息dump一份到本地磁盘

        @PostConstruct
        @Override
        protected void init() throws Throwable {
            dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor, dumpAllTagProcessor);
        }
    View Code

      ps:

      有兴趣可研究 ExternalDumpService#init -> DumpService#dumpConfigInfo -> DumpAllProcessor#process(第一行定位到3.8) -> ExternalStoragePersistServiceImpl#findAllConfigInfoFragment -> 分页将数据库的config_info(nacos的配置管理的配置列表信息)dump到本地磁盘 -> ConfigCacheService#dump -> DiskUtil#saveToDisk

      pps:所以nacos的配置信息优先从本地取,本地为空再从数据库取并更新到本地;

      可从 ConfigController#getConfig -> ConfigServletInner#doGetConfig() 中看到从本地缓存取,失败再从数据库查询并更新到本地;

       3.8.com.alibaba.nacos.config.server.service.repository.extrnal.ExternalConfigInfoPersistServiceImpl#findConfigMaxId

    public long findConfigMaxId() {
            //获取config_info表实现类
            ConfigInfoMapper configInfoMapper = mapperManager.findMapper(dataSourceService.getDataSourceType(),
                    TableConstant.CONFIG_INFO);
            String sql = configInfoMapper.findConfigMaxId();
            try {
                return jt.queryForObject(sql, Long.class);
            } catch (NullPointerException e) {
                return 0;
            }
        }
    View Code

       3.9.com.alibaba.nacos.plugin.datasource.MapperManager#findMapper

    public extends Mapper> R findMapper(String dataSource, String tableName) {
            LOGGER.info("[MapperManager] findMapper dataSource: {}, tableName: {}", dataSource, tableName);
            if (StringUtils.isBlank(dataSource) || StringUtils.isBlank(tableName)) {
                throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE, "dataSource or tableName is null");
            }
            Map tableMapper = MAPPER_SPI_MAP.get(dataSource);
            if (Objects.isNull(tableMapper)) {
                throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE,
                        "[MapperManager] Failed to find the datasource,dataSource:" + dataSource);
            }
            Mapper mapper = tableMapper.get(tableName);
            if (Objects.isNull(mapper)) {
                throw new NacosRuntimeException(FIND_TABLE_ERROR_CODE,
                        "[MapperManager] Failed to find the table ,tableName:" + tableName);
            }
            //nacos.plugin.datasource.log.enabled=true开启日志:jdk代理
            if (dataSourceLogEnable) {
                MapperProxy mapperProxy = new MapperProxy();
                return (R) mapperProxy.createProxy(mapper);
            }
            return (R) mapper;
        }
    View Code
  • 相关阅读:
    WiFi无线通信技术详解
    ssm毕设项目动态个人网站8j9pz(java+VUE+Mybatis+Maven+Mysql+sprnig)
    二叉树基本操作实现 && 树和二叉树&& 二叉树进阶oj && 堆的基本概念 && 优先级队列的使用_
    Linux网络技术学习(四)—— 用户空间与内核的接口
    day17--抓包工具fillder的使用
    初阶数据结构:链表相关题目练习(补充)
    董事长、CEO、总裁、总经理、总监的区别
    java计算机毕业设计-公益劳动招募管理系统-源码+数据库+系统+lw文档+mybatis+运行部署
    SpringBoot学习1—安装与配置
    Android 小知识 修改页面高度
  • 原文地址:https://www.cnblogs.com/huangrenhui/p/17562369.html