当前位置: 首页 > news >正文

家居定制类网站建设会员营销

家居定制类网站建设,会员营销,深圳市住房和城乡建设局,如何建网站并做推广从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 文章目录一…

从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。


文章目录

  • 一、Nacos官方文档
  • 二、实现步骤
    • 2.1 2.2.0版本源码下载
    • 2.2 引入Oracle驱动包
      • 2.2.1 nacos-all pom.xml
      • 2.2.2 nacos-config pom.xml
    • 2.3 nacos-config模块修改
    • 2.4 nacos-datasource-plugin模块修改(!!!重点!!!)
      • 2.4.1 DataSourceConstant类修改
      • 2.4.2 增加oracle的mapper实现类
      • 2.4.3 com.alibaba.nacos.plugin.datasource.mapper.Mapper修改
    • 2.5 nacos-console模块修改
    • 2.6 Nacos2.2.0适配Oracle12C-建表ddl语句
    • 2.7 打包
  • 总结


一、Nacos官方文档

Nacos整体介绍可看Nacos官方文档

二、实现步骤

下面,重点讲解如何通过修改源码实现Oracle适配

2.1 2.2.0版本源码下载

2.2.0版本源码下载

2.2 引入Oracle驱动包

根据适配版本选择对应驱动包

2.2.1 nacos-all pom.xml

            <dependency><groupId>com.oracle.ojdbc</groupId><artifactId>ojdbc8</artifactId><version>${ojdbc.version}</version></dependency>

2.2.2 nacos-config pom.xml

        <dependency><groupId>com.oracle.ojdbc</groupId><artifactId>ojdbc8</artifactId></dependency>

2.3 nacos-config模块修改

修改类config/src/main/java/com/alibaba/nacos/config/server/service/datasource/ExternalDataSourceProperties.java

修改后的代码如下:

/** 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 {//updateprivate String jdbcDriverName;//updateprivate String testQuery;private Integer num;private List<String> url = new ArrayList<>();private List<String> user = new ArrayList<>();private List<String> password = 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;}//add newpublic void setTestQuery(String testQuery) {if (StringUtils.isBlank(testQuery)) {this.testQuery = "SELECT 1";} else {this.testQuery = testQuery;}}//add newpublic void setJdbcDriverName(String jdbcDriverName) {if (StringUtils.isBlank(jdbcDriverName)) {this.jdbcDriverName = "com.mysql.cj.jdbc.Driver";} else {this.jdbcDriverName = jdbcDriverName;}}/*** 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");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);if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {poolProperties.setDriverClassName(jdbcDriverName);}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(testQuery);}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.4 nacos-datasource-plugin模块修改(!!!重点!!!)

2.4.1 DataSourceConstant类修改

修改类:plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/constants/DataSourceConstant.java
修改后的代码如下:

/** 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 DERBY = "derby";public static final String ORCLE = "oracle";
}

2.4.2 增加oracle的mapper实现类

先上截图,如下新增9个类:
在这里插入图片描述
在plugin/datasource/src/main/java/com/alibaba/nacos/plugin/datasource/impl/目录新建oracle目录,再在oracle目录新增实现类,各个类代码如下:
1.ConfigInfoAggrMapperByOracle

/** 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.oracle;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.ConfigInfoAggrMapper;import java.util.List;/*** The mysql implementation of ConfigInfoAggrMapper.** @author hyx**/public class ConfigInfoAggrMapperByOracle extends AbstractMapper implements ConfigInfoAggrMapper {@Overridepublic String batchRemoveAggr(List<String> datumList) {final StringBuilder datumString = new StringBuilder();for (String datum : datumList) {datumString.append('\'').append(datum).append("',");}datumString.deleteCharAt(datumString.length() - 1);return "DELETE FROM config_info_aggr WHERE data_id = ? AND group_id = ? AND tenant_id = ? AND datum_id IN ("+ datumString + ")";}@Overridepublic 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();}@Overridepublic 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";}@Overridepublic String findConfigInfoAggrByPageFetchRows(int startRow, int pageSize) {return "SELECT * FROM (SELECT data_id,group_id,tenant_id,datum_id,app_name,content, ROWNUM as rnum"+ " FROM config_info_aggr WHERE data_id= ? AND "+ "group_id= ? AND tenant_id= ? ORDER BY datum_id) WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum";}@Overridepublic String findAllAggrGroupByDistinct() {return "SELECT DISTINCT data_id, group_id, tenant_id FROM config_info_aggr";}@Overridepublic String getTableName() {return TableConstant.CONFIG_INFO_AGGR;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

2.ConfigInfoBetaMapperByOracle

/** 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.oracle;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.ConfigInfoBetaMapper;/*** The mysql implementation of ConfigInfoBetaMapper.** @author hyx**/public class ConfigInfoBetaMapperByOracle extends AbstractMapper implements ConfigInfoBetaMapper {@Overridepublic 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 = '')";}@Overridepublic String findAllConfigInfoBetaForDumpAllFetchRows(int startRow, int pageSize) {return " SELECT * FROM (SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips,encrypted_data_key "+ " FROM ( SELECT * FROM (SELECT id, ROWNUM as rnum FROM config_info_beta  ORDER BY id) "+ "WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum" + " )"+ "  g, config_info_beta t WHERE g.id = t.id ";}@Overridepublic String getTableName() {return TableConstant.CONFIG_INFO_BETA;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

3.ConfigInfoMapperByOracle

/** 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.oracle;import com.alibaba.nacos.common.utils.CollectionUtils;
import com.alibaba.nacos.common.utils.StringUtils;
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.ConfigInfoMapper;import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** The mysql implementation of ConfigInfoMapper.** @author hyx**/public class ConfigInfoMapperByOracle 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";@Overridepublic String findConfigMaxId() {return "SELECT MAX(id) FROM config_info";}@Overridepublic String findAllDataIdAndGroup() {return "SELECT DISTINCT data_id, group_id FROM config_info";}@Overridepublic String findConfigInfoByAppCountRows() {return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ? AND app_name= ?";}@Overridepublic String findConfigInfoByAppFetchRows(int startRow, int pageSize) {return "SELECT * FROM (SELECT id,data_id,group_id,tenant_id,app_name,content, ROWNUM as rnum FROM config_info"+ " WHERE tenant_id LIKE ? AND app_name= ?)" + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum";}@Overridepublic String configInfoLikeTenantCount() {return "SELECT count(*) FROM config_info WHERE tenant_id LIKE ?";}@Overridepublic String getTenantIdList(int startRow, int pageSize) {return "SELECT * FROM (SELECT tenant_id, ROWNUM as rnum FROM config_info WHERE tenant_id != '' GROUP BY tenant_id)"+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum";}@Overridepublic String getGroupIdList(int startRow, int pageSize) {return "SELECT * FROM (SELECT group_id, ROWNUM as rnum FROM config_info WHERE tenant_id ='' GROUP BY group_id) "+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum";}@Overridepublic String findAllConfigKey(int startRow, int pageSize) {return " SELECT data_id,group_id,app_name  FROM ( "+ " SELECT * FROM (SELECT id, ROWNUM as rnum FROM config_info WHERE tenant_id LIKE ? ORDER BY id)"+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum"+ " )" + " g, config_info t WHERE g.id = t.id  ";}@Overridepublic String findAllConfigInfoBaseFetchRows(int startRow, int pageSize) {return "SELECT t.id,data_id,group_id,content,md5"+ " FROM (SELECT * FROM ( SELECT id, ROWNUM as rnum FROM config_info ORDER BY id)"+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum) "+ " g, config_info t  WHERE g.id = t.id ";}@Overridepublic String findAllConfigInfoFragment(int startRow, int pageSize) {return "SELECT * FROM (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) " + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum) ";}@Overridepublic 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 <= ?";}@Overridepublic String findChangeConfigCountRows(Map<String, String> 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;}@Overridepublic 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;final String sqlFetchRows = "SELECT * FROM (SELECT id,data_id,group_id,tenant_id,app_name,content,type,md5,gmt_modified"+ ", ROWNUM as rnum 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)" + " WHERE  rnum >= " + 0 + " and " + pageSize + " >= rnum";}@Overridepublic 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 * FROM ( SELECT id, ROWNUM as rnum FROM config_info ORDER BY id) "+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum "+ " ) g, config_info t WHERE g.id = t.id";}@Overridepublic String findAllConfigInfo4Export(List<Long> ids, Map<String, String> 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<Object> 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;}@Overridepublic String findConfigInfoBaseLikeCountRows(Map<String, String> 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;}@Overridepublic String findConfigInfoBaseLikeFetchRows(Map<String, String> params, int startRow, int pageSize) {final String sqlFetchRows = "SELECT * FROM (SELECT id,data_id,group_id,tenant_id,content, ROWNUM as rnum 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 + ") " + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String findConfigInfo4PageCountRows(Map<String, String> 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;}@Overridepublic 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 sql = "SELECT * FROM (SELECT id,data_id,group_id,tenant_id,app_name,content,type,encrypted_data_key,"+ " ROWNUM as rnum 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 + ")  " + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String findConfigInfoBaseByGroupFetchRows(int startRow, int pageSize) {return "SELECT * FROM (SELECT id,data_id,group_id,content, ROWNUM as rnum FROM config_info WHERE group_id=? AND tenant_id=?" + ")  "+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String findConfigInfoLike4PageCountRows(Map<String, String> 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;}@Overridepublic 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 * FROM (SELECT id,data_id,group_id,tenant_id,app_name,content,encrypted_data_key,"+ " ROWNUM as rnum 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 + " ) " + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String findAllConfigInfoFetchRows(int startRow, int pageSize) {return "SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5 "+ " FROM (SELECT * FROM (  SELECT id, ROWNUM as rnum FROM config_info WHERE tenant_id LIKE ? ORDER BY id)"+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum)"+ " g, config_info t  WHERE g.id = t.id ";}@Overridepublic 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();}@Overridepublic 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();}@Overridepublic String getTableName() {return TableConstant.CONFIG_INFO;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}@Overridepublic 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='')";}
}

4.ConfigInfoTagMapperByOracle

/** 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.oracle;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.ConfigInfoTagMapper;/*** The mysql implementation of ConfigInfoTagMapper.** @author hyx**/public class ConfigInfoTagMapperByOracle extends AbstractMapper implements ConfigInfoTagMapper {@Overridepublic 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 = '')";}@Overridepublic 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 * FROM ( SELECT id, ROWNUM as rnum FROM config_info_tag  ORDER BY id) "+ " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ) "+ "g, config_info_tag t  WHERE g.id = t.id  ";}@Overridepublic String getTableName() {return TableConstant.CONFIG_INFO_TAG;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

5.ConfigTagsRelationMapperByOracle

/** 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.oracle;import com.alibaba.nacos.common.utils.StringUtils;
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.ConfigTagsRelationMapper;import java.util.Map;/*** The mysql implementation of ConfigTagsRelationMapper.** @author hyx**/public class ConfigTagsRelationMapperByOracle extends AbstractMapper implements ConfigTagsRelationMapper {@Overridepublic String findConfigInfo4PageCountRows(final Map<String, String> 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;}@Overridepublic 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");StringBuilder where = new StringBuilder(" WHERE ");final String sql ="SELECT * FROM (SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content, ROWNUM as rnum 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 + ")" + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String findConfigInfoLike4PageCountRows(final Map<String, String> 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;}@Overridepublic 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");StringBuilder where = new StringBuilder(" WHERE ");final String sqlFetchRows = "SELECT * FROM (SELECT a.id,a.data_id,a.group_id,a.tenant_id,a.app_name,a.content, ROWNUM as rnum "+ "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 + ") " + " WHERE  rnum >= " + startRow + " and " + pageSize + " >= rnum ";}@Overridepublic String getTableName() {return TableConstant.CONFIG_TAGS_RELATION;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

6.GroupCapacityMapperByOracle

/** 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.oracle;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.GroupCapacityMapper;/*** The derby implementation of {@link GroupCapacityMapper}.** @author lixiaoshuang*/
public class GroupCapacityMapperByOracle extends AbstractMapper implements GroupCapacityMapper {@Overridepublic String getTableName() {return TableConstant.GROUP_CAPACITY;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}@Overridepublic 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";}@Overridepublic 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 = ''";}@Overridepublic String incrementUsageByWhereQuotaEqualZero() {return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < ? AND quota = 0";}@Overridepublic String incrementUsageByWhereQuotaNotEqualZero() {return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ? AND `usage` < quota AND quota != 0";}@Overridepublic String incrementUsageByWhere() {return "UPDATE group_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE group_id = ?";}@Overridepublic String decrementUsageByWhere() {return "UPDATE group_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE group_id = ? AND `usage` > 0";}@Overridepublic String updateUsage() {return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info), gmt_modified = ? WHERE group_id = ?";}@Overridepublic String updateUsageByWhere() {return "UPDATE group_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE group_id=? AND tenant_id = ''),"+ " gmt_modified = ? WHERE group_id= ?";}@Overridepublic String selectGroupInfoBySize() {return "SELECT id, group_id FROM group_capacity WHERE id > ? LIMIT ?";}
}

7.HistoryConfigInfoMapperByOracle

/** 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.oracle;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.HistoryConfigInfoMapper;/*** The mysql implementation of HistoryConfigInfoMapper.** @author hyx**/public class HistoryConfigInfoMapperByOracle extends AbstractMapper implements HistoryConfigInfoMapper {@Overridepublic String removeConfigHistory() {return "DELETE FROM his_config_info WHERE gmt_modified < ? LIMIT ?";}@Overridepublic String findConfigHistoryCountByTime() {return "SELECT count(*) FROM his_config_info WHERE gmt_modified < ?";}@Overridepublic 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 <= ?";}@Overridepublic 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";}@Overridepublic 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 = ?) ";}@Overridepublic String getTableName() {return TableConstant.HIS_CONFIG_INFO;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

8.TenantCapacityMapperByOracle

/** 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.oracle;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.TenantCapacityMapper;/*** The mysql implementation of TenantCapacityMapper.** @author hyx**/public class TenantCapacityMapperByOracle extends AbstractMapper implements TenantCapacityMapper {@Overridepublic String getTableName() {return TableConstant.TENANT_CAPACITY;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}@Overridepublic String incrementUsageWithDefaultQuotaLimit() {return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` <"+ " ? AND quota = 0";}@Overridepublic String incrementUsageWithQuotaLimit() {return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` < "+ "quota AND quota != 0";}@Overridepublic String incrementUsage() {return "UPDATE tenant_capacity SET `usage` = `usage` + 1, gmt_modified = ? WHERE tenant_id = ?";}@Overridepublic String decrementUsage() {return "UPDATE tenant_capacity SET `usage` = `usage` - 1, gmt_modified = ? WHERE tenant_id = ? AND `usage` > 0";}@Overridepublic String correctUsage() {return "UPDATE tenant_capacity SET `usage` = (SELECT count(*) FROM config_info WHERE tenant_id = ?), "+ "gmt_modified = ? WHERE tenant_id = ?";}@Overridepublic String getCapacityList4CorrectUsage() {return "SELECT id, tenant_id FROM tenant_capacity WHERE id>? LIMIT ?";}@Overridepublic 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=?;";}
}

9.TenantInfoMapperByOracle

/** 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.oracle;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;/*** The mysql implementation of TenantInfoMapper.** @author hyx**/public class TenantInfoMapperByOracle extends AbstractMapper implements TenantInfoMapper {@Overridepublic String getTableName() {return TableConstant.TENANT_INFO;}@Overridepublic String getDataSource() {return DataSourceConstant.ORCLE;}
}

2.4.3 com.alibaba.nacos.plugin.datasource.mapper.Mapper修改

修改类:plugin/datasource/src/main/resources/META-INF/services/com.alibaba.nacos.plugin.datasource.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.GroupCapacityMapperByMysqlcom.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.GroupCapacityMapperByDerbycom.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoAggrMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoBetaMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.ConfigInfoTagMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.ConfigTagsRelationMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.HistoryConfigInfoMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.TenantInfoMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.TenantCapacityMapperByOracle
com.alibaba.nacos.plugin.datasource.impl.oracle.GroupCapacityMapperByOracle

2.5 nacos-console模块修改

修改配置文件:console/src/main/resources/application.properties
只修改一部分,数据源连接信息,截图如下:
在这里插入图片描述

nacos.plugin.datasource.log.enabled=true
spring.sql.init.platform=oracle
### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:oracle:thin:@192.168.10.2:1521/xe
db.user.0=nacos220
db.password.0=123456
db.jdbcDriverName=oracle.jdbc.OracleDriver
db.testQuery=select 1 from dual

2.6 Nacos2.2.0适配Oracle12C-建表ddl语句

Nacos2.2.0适配Oracle12C-建表ddl语句

2.7 打包

在nacos-all目录下执行mvn命令
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U
最后在distributioni目录下的target就会出现压缩文件了,这样就相当于从nacos官网直接下载的压缩包,具体nacos配置可以自行完成。
在这里插入图片描述


总结

以上就是Nacos2.2.0多数据源适配oracle12C-修改Nacos源码的步骤


曾经淋过雨,希望大家都有伞!

http://www.hrbkazy.com/news/2086.html

相关文章:

  • 快站怎么做淘客网站安卓优化大师老版本
  • 顺德网站制作有哪些公司六年级上册数学优化设计答案
  • 广州网站设计公司哪里济南兴田德润怎么联系百度网址名称是什么
  • 安徽网站建设方案优化互联网营销师是哪个部门发证
  • 企业信息查询网官网厦门seo报价
  • 网站推广怎么做比较好百度付费推广的费用
  • ftp上传网站后怎么弄b2b平台推广
  • 微信平台做微文网站链接网店网络推广方案
  • 广东手机网站建设费用班级优化大师的功能
  • 济南网站建设熊掌号googleseo推广
  • 怎么建网站做学网络运营需要多少钱
  • 互联网App网站建设方案哈尔滨seo网络推广
  • 域名查询官方网站想找搜索引擎优化
  • 重庆seo小潘大神seo收费还是免费
  • 网站群建设 公司今日新闻最新头条10条
  • wordpress标签转拼音哪个网站学seo是免费的
  • 网站 展示百度快照优化seo
  • 网站建设的相应技术长沙网站优化排名推广
  • 自己人网站建设自己在家怎么做电商
  • 专业做包包的网站好网站优化设计的基础是网站基本要素及每个细节的优化
  • 能看男女做那个的网站怎么下载app到手机上
  • 网站中的实名身份证验证怎么做东莞seo顾问
  • 长春有几个站可以坐火车百度指数排名热搜榜
  • 建网站的哪家好搭建一个网站
  • 模仿网站千部小黄油资源百度云
  • 泛站群百度问答平台
  • 视频网站怎么做的反爬虫广州seo软件
  • 可视化编辑建站平台网络推广员要怎么做
  • 官方网站怎样做百度指数的使用方法
  • 找别人做网站多少钱网络营销类型