Nacos2.2.0多数据源适配oracle12C-修改Nacos源码
从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源码的步骤
曾经淋过雨,希望大家都有伞!