diff --git a/README.md b/README.md
index 506d0dc3e30c7b26efb14cf9266c93433657bfc4..23c5ddedd16ed02d0218ad927a623b5af7d3d010 100644
--- a/README.md
+++ b/README.md
@@ -9,19 +9,19 @@
+ OpenGauss (高斯)
+ Oracle(8, 9, 10, 11, 12 ... )
+ PostgreSQL
+ + Derby
#### 软件架构
作为nacos的插件使用
#### 版本映射
-| 插件版本 | 构建时使用的nacos版本 | 支持的Nacos版本 | 测试过的nacos版本 |
-| ------------- | :-------------------: | :-------------: | ----------------- |
-| 1.0.x | 2.4.1 | 理论上是 all | 2.3.2、2.4.1 |
-| 2.0.0 - 2.0.5 | 2.4.1 | 理论上是 all | 2.3.2、2.4.1 |
-| | | | |
-
+| 插件版本 | 构建时使用的nacos版本 | 支持的Nacos版本 | 测试过的nacos版本 |
+|:-------------:|:------------------:|:------------:|-------------------------------------------------|
+| `1.0.x` | `2.4.1` | 理论上`>=2.2.0` | `2.3.2`
`2.4.1` |
+| `2.0.0` ~ `2.0.7` | `2.4.1` | 理论上`>=2.2.0` | `2.3.2`
`2.4.1` |
+支持的nacos 版本,从2.2.0开始原因:nacos 2.2.0才支持这一套插件系统,在此之前需要直接修改nacos的源码。
#### 安装教程
diff --git a/RELEASE-LOG.MD b/RELEASE-LOG.MD
index 16f098a29a5c0930503fd28533ec9387a46a5ab9..20cfbc86a46f20e6aeb40775db00389d93831485 100644
--- a/RELEASE-LOG.MD
+++ b/RELEASE-LOG.MD
@@ -1,3 +1,12 @@
+## 2.0.8
+1. 代码整理,简化 *Mapper 类
+2. 避免dialect等重复创建,重复打印日志
+3. 对介质瘦身
+4. 默认的 ddl identifier quote mode 修改为 unquoted
+## 2.0.7
+1. 支持禁用nacos默认插件derby, mysql
+2. 提供derby 的sql schema
+3. 支持derby数据库
## 2.0.6
1. 解决OpenGauss中将`''`处理成NULL的情况
## 2.0.5
diff --git a/nacosplugin-all/pom.xml b/nacosplugin-all/pom.xml
index 596699c6709823e84cb5f97acad7bea2e05ec2c1..91739f8228d9f3d208a0e68212cf0aa538023c26 100644
--- a/nacosplugin-all/pom.xml
+++ b/nacosplugin-all/pom.xml
@@ -6,13 +6,13 @@
io.github.bes2008.solution.nacosplugins
nacos-plugins
- 2.0.6
+ 2.0.8
nacosplugin-all
${project.groupId}:${project.artifactId}:${project.version}
- 3.4.1
+ 3.5.0
@@ -189,6 +189,7 @@
+ true
diff --git a/nacosplugin-all/src/main/java/com/jn/nacos/plugin/JnNacosPlugin.java b/nacosplugin-all/src/main/java/com/jn/nacos/plugin/JnNacosPlugin.java
index 9785176d081b7e46175a057992ad2c8d75c83bad..76cfb62d722e02543dffe5289dc6e4fc53deed15 100644
--- a/nacosplugin-all/src/main/java/com/jn/nacos/plugin/JnNacosPlugin.java
+++ b/nacosplugin-all/src/main/java/com/jn/nacos/plugin/JnNacosPlugin.java
@@ -1,5 +1,14 @@
package com.jn.nacos.plugin;
-public class JnNacosPlugin {
+import com.alibaba.nacos.plugin.datasource.MapperManager;
+import com.jn.langx.lifecycle.AbstractInitializable;
+import com.jn.langx.lifecycle.InitializationException;
+
+public class JnNacosPlugin extends AbstractInitializable {
private JnNacosPlugin(){}
+
+ @Override
+ public void init() throws InitializationException {
+ MapperManager.instance(true).loadInitial();
+ }
}
diff --git a/nacosplugin-datasource-sqlscript/pom.xml b/nacosplugin-datasource-sqlscript/pom.xml
index cce5a821e750f2b382bab04b7ceee2a0056f0739..adbea2dd6169d59e14f6764f08ba44f0c3c2b48b 100644
--- a/nacosplugin-datasource-sqlscript/pom.xml
+++ b/nacosplugin-datasource-sqlscript/pom.xml
@@ -6,7 +6,7 @@
io.github.bes2008.solution.nacosplugins
nacos-plugins
- 2.0.6
+ 2.0.8
nacosplugin-datasource-sqlscript
diff --git a/nacosplugin-datasource-sqlscript/resources/sql/README.MD b/nacosplugin-datasource-sqlscript/resources/sql/README.MD
index 0b2ebf461cd3085858bab78e7a984c25fac35ac1..baac2269219387d5820d29a217a0be3b5c3cec10 100644
--- a/nacosplugin-datasource-sqlscript/resources/sql/README.MD
+++ b/nacosplugin-datasource-sqlscript/resources/sql/README.MD
@@ -1,5 +1,5 @@
在DDL语句中,identifier(表名、列名)的要求:
-+ 尽量统一加上引号
++ 尽量统一不加引号
+ 如果不想统一加引号,按如下规则来处理:
+ 不加引号的identifier,必须使用小写形式 (原因: nacos 中的代码中,将列名、表名都是定死的小写),由数据库内部自行处理。
+ 加引号的identifier,按照数据库对不加引号的identifier的处理方式来处理。
diff --git a/nacosplugin-datasource-sqlscript/resources/sql/derby/derby-schema.sql b/nacosplugin-datasource-sqlscript/resources/sql/derby/derby-schema.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3d955fca55903b4898c59fb7494ece582bd2fbdc
--- /dev/null
+++ b/nacosplugin-datasource-sqlscript/resources/sql/derby/derby-schema.sql
@@ -0,0 +1,227 @@
+/*
+ * 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.
+ */
+
+CREATE SCHEMA nacos AUTHORIZATION nacos;
+
+CREATE TABLE config_info (
+ id bigint NOT NULL generated by default as 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(50) 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 LONG VARCHAR DEFAULT NULL,
+ encrypted_data_key LONG VARCHAR 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 generated by default as 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(50) DEFAULT NULL,
+ op_type char(10) DEFAULT NULL,
+ encrypted_data_key LONG VARCHAR 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 generated by default as 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(50) DEFAULT NULL,
+ encrypted_data_key LONG VARCHAR 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 generated by default as 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(50) 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 generated by default as 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 generated by default as 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 generated by default as 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 generated by default as 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 generated by default as 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 generated by default as 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 generated by default as 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 generated by default as 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 boolean NOT NULL DEFAULT true
+);
+
+CREATE TABLE roles (
+ username varchar(50) NOT NULL,
+ role varchar(50) NOT NULL,
+ constraint uk_username_role UNIQUE (username,role)
+);
+
+CREATE TABLE permissions (
+ role varchar(50) NOT NULL,
+ resource varchar(512) NOT NULL,
+ action varchar(8) NOT NULL,
+ constraint uk_role_permission UNIQUE (role,resource,action)
+);
+
+
+/******************************************/
+/* ipv6 support */
+/******************************************/
+ALTER TABLE config_info_tag
+MODIFY COLUMN src_ip varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER src_user;
+
+ALTER TABLE his_config_info
+MODIFY COLUMN src_ip varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL AFTER src_user;
+
+ALTER TABLE config_info
+MODIFY COLUMN src_ip varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER src_user;
+
+ALTER TABLE config_info_beta
+MODIFY COLUMN src_ip varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip' AFTER src_user;
\ No newline at end of file
diff --git a/nacosplugin-datasource/installation.MD b/nacosplugin-datasource/installation.MD
index 2a963d3a7b6d7da0640091c9e47757fc498a0b52..0fa4ba3cfbcae104daa8d79cdde604ab0ab8d502 100644
--- a/nacosplugin-datasource/installation.MD
+++ b/nacosplugin-datasource/installation.MD
@@ -1,12 +1,12 @@
## datasource 插件安装
-1. 将插件、数据库驱动 放到 `nacos/plugins` 目录
+1. 将插件、数据库驱动 放到 `/plugins` 目录
```text
io.github.bes2008.solution.nacosplugins:nacosplugin-all:jar:VERSION
```
2. 在application.properties中配置数据库
-以postgresql 数据库为例,修改 `nacos/conf/application.properties` :
+以postgresql 数据库为例,修改 `/conf/application.properties` :
```properties
# PostgreSQL
spring.sql.init.platform=postgresql
@@ -19,9 +19,9 @@ db.pool.config.driverClassName=org.postgresql.Driver
3. 初始数据库schema
-使用DBeaver 等工具,连接到数据库,执行相关schema初始化。脚本位置:
+使用DBeaver、 数据库 CLI 等工具,连接到数据库,执行相关schema初始化。脚本位置:
```text
-nacosplugin-datasource-sqlscripts/resources/sql/ 目录下
+代码仓库的nacosplugin-datasource-sqlscripts/resources/sql/ 目录下
```
4. 启动nacos访问
@@ -134,20 +134,24 @@ mysql --password=root_password --host=localhost --port=3306 --user root < create
# MySQL
spring.sql.init.platform=mysql
db.num=1
-db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useServerPrepStmts=true
+db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useServerPrepStmts=true&allowPublicKeyRetrieval=true
db.user.0=root
db.password.0=root_password
db.pool.config.driverClassName=com.mysql.cj.jdbc.Driver
+# mysql默认使用nacos 内置的mysql插件,如果要禁用内置mysql插件,可以添加下面的配置
+spring.sql.plugin.builtin.enabled=false
+```
+3. 版本限制
+```text
+nacos_version >= 2.3.0 时,支持将mysql替换为本插件。
```
-
-
## 支持Oracle
1. 脚本执行
```shell
-# 先用 system 创建 C##NACOS用户
+# 先用 system 创建 "C##NACOS" 用户
sqlplus system/Oracle123_Pswd@localhost:1521/FREE @./create-schema.sql
-# 再用 C##NACOS用户创建表
+# 再用 "C##NACOS" 用户创建表
sqlplus C##NACOS/NACOS_PASSWORD@localhost:1521/FREE @./create-tables.sql
```
2. jdbc配置
@@ -164,8 +168,25 @@ db.pool.config.driverClassName=oracle.jdbc.OracleDriver
```
3. 目前使用Oracle的问题
- + 目前nacos 适配Oracle已完毕,但在启动过程中,nacos.log中会有报错。
+ + 目前nacos 适配Oracle已完毕,但在启动过程中,nacos.log中会有报错,这个错误并不影响 oracle 数据库上使用。
+ 问题原因:是 nacos 启动是会判定 config_info_tag, config_info_beta表是否存在。 这个方法是直接定死的使用了limit 1,没有通过插件的方式。
+ 问题归属:这个属于 nacos 的Bug,已在 [github 上提交了相关问题](https://github.com/alibaba/nacos/issues/12569)。
- + 问题版本:<=2.4.1
- + 影响范围:只会影响到dump接口,功能不受影响
\ No newline at end of file
+ + 问题版本:<=2.4.1,已于 nacos 2.4.2 版本修复
+ + 影响范围:只会影响到dump接口,功能不受影响
+
+## 支持Derby
+
+1. 配置
+```properties
+# derby 默认使用 nacos 内置的 derby 插件,如果要禁用内置 derby 插件,可以添加下面的配置
+spring.sql.plugin.builtin.enabled=false
+```
+2. 启动
+```shell
+# 必须以 standalone 模式启动时,且不配置为其它数据库的情况下,才会启用 derby数据库
+/bin/startup.sh -m standalone
+```
+3. 版本限制
+```text
+nacos_version >= 2.3.0 时,支持将 derby 替换为本插件。
+```
\ No newline at end of file
diff --git a/nacosplugin-datasource/pom.xml b/nacosplugin-datasource/pom.xml
index f6f4a9260e21608664edfa2b2d06c952f6eeef19..ac72aa95524af8cfe3e6768c082c2b5e4ef86e1e 100644
--- a/nacosplugin-datasource/pom.xml
+++ b/nacosplugin-datasource/pom.xml
@@ -6,7 +6,7 @@
io.github.bes2008.solution.nacosplugins
nacos-plugins
- 2.0.6
+ 2.0.8
nacosplugin-datasource
@@ -45,7 +45,7 @@
junit
junit
- 4.11
+ 4.13.1
test
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosDatabaseDialect.java
index e1cd3bf7fe6ac8c9e151788aefb06b5aa45ea173..2be15da21d726aff32b68377150275ad39c5788a 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosDatabaseDialect.java
@@ -31,7 +31,7 @@ public abstract class NacosDatabaseDialect {
String sqlhelperDialect = getCustomizedDialect(this.name);
this.delegate = DialectRegistry.getInstance().gaussDialect(sqlhelperDialect);
this.functionMap = initFunctionMap();
- this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
+ this.identifierQuotedMode = IdentifierQuotedMode.UNQUOTED;
}
public IdentifierQuotedMode getPluginProvidedDDLIdentifierQuotedMode(){
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosEnvs.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosEnvs.java
new file mode 100644
index 0000000000000000000000000000000000000000..2084b056731a6517ae55ee53a8a67e46097f0831
--- /dev/null
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/NacosEnvs.java
@@ -0,0 +1,117 @@
+package com.jn.nacos.plugin.datasource;
+
+import com.alibaba.nacos.common.utils.VersionUtils;
+import com.alibaba.nacos.sys.env.EnvUtil;
+import com.jn.langx.util.Objs;
+import com.jn.langx.util.Strings;
+import com.jn.langx.util.enums.Enums;
+import com.jn.langx.util.logging.Loggers;
+import com.jn.langx.util.reflect.Reflects;
+import com.jn.sqlhelper.dialect.Dialect;
+import com.jn.sqlhelper.dialect.DialectRegistry;
+import org.slf4j.Logger;
+
+public class NacosEnvs {
+ /**
+ * 指定要使用什么数据源
+ */
+ @Deprecated
+ private static final String CONFIG_KEY_DATASOURCE_PLATFORM_DEPRECATED="spring.datasource.platform";
+ private static final String CONFIG_KEY_DATASOURCE_PLATFORM="spring.sql.init.platform";
+
+ /**
+ * 是否启用 nacos 默认的 datasource 插件。
+ */
+ private static final String CONFIG_KEY_DATASOURCE_PLUGIN_BUILTIN_ENABLED="spring.sql.plugin.builtin.enabled";
+
+ /**
+ * 创建数据库schema时,使用的DDL语句中,identifier 的引号模式
+ */
+ private static final String CONFIG_KEY_DB_DDL_IDENTIFIER_QUOTED_MODE="db.sql.identifier.quoted.mode";
+
+ public static int versionCompare(String comparedVersion) {
+ String currentVersion = toNacosStandardVersion(VersionUtils.version);
+ String version2 = toNacosStandardVersion(comparedVersion);
+ return VersionUtils.compareVersion(currentVersion, version2);
+ }
+
+ private static String toNacosStandardVersion(String version) {
+ String[] segments = Strings.split(version, ".");
+ String nacosVersion = Strings.join(".", segments, 0, 3);
+ return nacosVersion;
+ }
+
+
+
+ public static boolean hasEncryptedDataKeyColumn() {
+ return versionCompare("2.1.0") >= 0;
+ }
+
+ /**
+ * 当使用的 create-schema.sql, create-tables.sql 不是插件提供的,需要指定该配置。
+ */
+ public static IdentifierQuotedMode getConfiguredIdentifierQuotedMode(NacosDatabaseDialect dialect) {
+ String modeString = EnvUtil.getProperty(CONFIG_KEY_DB_DDL_IDENTIFIER_QUOTED_MODE);
+ IdentifierQuotedMode mode = null;
+ if (Strings.isNotBlank(modeString)) {
+ mode = Enums.ofName(IdentifierQuotedMode.class, modeString);
+ }
+ if (mode == null) {
+ mode = dialect.getPluginProvidedDDLIdentifierQuotedMode();
+ }
+ if (mode == null) {
+ mode = IdentifierQuotedMode.UNQUOTED;
+ }
+ return mode;
+ }
+
+ public static String getConfiguredDatabaseName() {
+ String databaseName = EnvUtil.getProperty(CONFIG_KEY_DATASOURCE_PLATFORM);
+ if (Strings.isBlank(databaseName)) {
+ // 这个是 nacos 中更早的配置 datasource 类型的方式
+ databaseName = EnvUtil.getProperty(CONFIG_KEY_DATASOURCE_PLATFORM_DEPRECATED);
+ }
+ if (Strings.isBlank(databaseName)) {
+ // 内嵌数据库 derby
+ if (EnvUtil.getStandaloneMode()) {
+ databaseName = DatabaseNames.DERBY;
+ } else { // 默认数据库 MySQL
+ databaseName = DatabaseNames.MSSQL;
+ }
+ } else {
+ Dialect dialect = DialectRegistry.getInstance().gaussDialect(databaseName);
+ if (dialect == null) {
+ databaseName = DatabaseNames.UNSUPPORTED;
+ }
+ }
+
+ if (Strings.isBlank(databaseName)) {
+ databaseName = DatabaseNames.UNDEFINED;
+ }
+
+ if (Objs.equals(DatabaseNames.DERBY, databaseName) || Objs.equals(DatabaseNames.MYSQL, databaseName)) {
+ // 只要不是false|False 等,就是禁用,默认值为 true
+ boolean builtinDatasourcePluginEnabled = NacosEnvs.supportsBuiltinDatabasePluginReplaced() && (!Strings.equalsIgnoreCase(EnvUtil.getProperty(CONFIG_KEY_DATASOURCE_PLUGIN_BUILTIN_ENABLED, "true"), "false"));
+
+ // 自定义的插件会优先于 内置的 derby, mysql 插件
+ // 放到 MapperManager 中使用了 map#putIfAbsent,所以要启用 内置的 derby, mysql,必须保证 自定义的插件名字不能是 mysql,derby
+ Logger logger = Loggers.getLogger(NacosEnvs.class);
+ logger.info("nacos builtin datasource plugin is {}", builtinDatasourcePluginEnabled ? "enabled" : "disabled");
+ if (builtinDatasourcePluginEnabled) {
+ databaseName = DatabaseNames.UNDEFINED;
+ logger.info("rename the customized mapper {} to {}", Reflects.getFQNClassName(NacosEnvs.class), databaseName);
+ }
+ }
+ return databaseName;
+ }
+
+ /**
+ * 内置 数据库插件 (derby, mysql) 是否可以被替换
+ *
+ * @return 是否可替换
+ */
+ public static boolean supportsBuiltinDatabasePluginReplaced() {
+ return versionCompare("2.3.0") >= 0;
+ }
+
+}
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/PluginContext.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/PluginContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb25ceb81221e5504d740f10cfbe2ad905699ac3
--- /dev/null
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/PluginContext.java
@@ -0,0 +1,44 @@
+package com.jn.nacos.plugin.datasource;
+
+import com.jn.langx.lifecycle.AbstractInitializable;
+import com.jn.langx.lifecycle.InitializationException;
+import com.jn.langx.util.Objs;
+import com.jn.langx.util.Preconditions;
+import com.jn.langx.util.logging.Loggers;
+import org.slf4j.Logger;
+
+public class PluginContext extends AbstractInitializable {
+ private String databaseName;
+ protected NacosDatabaseDialect dialect;
+ private IdentifierQuotedMode identifierQuotedModeInDDL;
+ private PluginContext(){
+ init();
+ }
+
+ @Override
+ protected void doInit() throws InitializationException {
+ Logger logger = Loggers.getLogger(PluginContext.class);
+ logger.info("================== nacos datasource plugin context initial==================");
+ this.databaseName = NacosEnvs.getConfiguredDatabaseName();
+ Preconditions.checkTrue(!Objs.equals(DatabaseNames.UNSUPPORTED, this.databaseName), "database {} is unsupported", this.databaseName);
+ this.dialect = NacosDatabaseDialectManager.getInstance().getDialect(this.databaseName);
+ this.identifierQuotedModeInDDL = NacosEnvs.getConfiguredIdentifierQuotedMode(this.dialect);
+ logger.info("dialect: {}, identifierQuotedMode: {}", this.databaseName, this.identifierQuotedModeInDDL);
+ logger.info("================== nacos datasource plugin context initial finished ==================");
+ }
+
+ public static final PluginContext INSTANCE = new PluginContext();
+
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ public IdentifierQuotedMode getIdentifierQuotedModeInDDL() {
+ return identifierQuotedModeInDDL;
+ }
+
+ public NacosDatabaseDialect getDialect() {
+ return dialect;
+ }
+}
+
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/derby/DerbyDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/derby/DerbyDatabaseDialect.java
index 3e519eecb3d9153457f3d91c6014c1ef7fb4c4d5..d8711308d27ca0ad369fe7b84500eee48b6de651 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/derby/DerbyDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/derby/DerbyDatabaseDialect.java
@@ -2,6 +2,7 @@ package com.jn.nacos.plugin.datasource.db.derby;
import com.alibaba.nacos.plugin.datasource.enums.derby.TrustedDerbylFunctionEnum;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class DerbyDatabaseDialect extends NacosDatabaseDialect {
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/gauss/OpenGaussDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/gauss/OpenGaussDatabaseDialect.java
index 23d2363ef5b7aa6545e093873463ad6e56d76e4c..75db79ef8c30250f72bbbf5279d2bddf09056826 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/gauss/OpenGaussDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/gauss/OpenGaussDatabaseDialect.java
@@ -1,11 +1,13 @@
package com.jn.nacos.plugin.datasource.db.gauss;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class OpenGaussDatabaseDialect extends NacosDatabaseDialect {
public OpenGaussDatabaseDialect() {
super(DatabaseNames.OPENGAUSS);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/kingbase/KingbaseDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/kingbase/KingbaseDatabaseDialect.java
index 79fe934e9850ec1de20209ea01c2f34f9c1a959b..1c010dd2734cea8669f8782a0ba21cc18f70563a 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/kingbase/KingbaseDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/kingbase/KingbaseDatabaseDialect.java
@@ -1,11 +1,13 @@
package com.jn.nacos.plugin.datasource.db.kingbase;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class KingbaseDatabaseDialect extends NacosDatabaseDialect {
public KingbaseDatabaseDialect() {
super(DatabaseNames.KINGBASE);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/magicdata/MagicDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/magicdata/MagicDatabaseDialect.java
index 779a914265d11d99ddc7ef08d17f6f72c0077d66..f2b27cb2144756693b3edd473282fc532300ff40 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/magicdata/MagicDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/magicdata/MagicDatabaseDialect.java
@@ -1,11 +1,13 @@
package com.jn.nacos.plugin.datasource.db.magicdata;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class MagicDatabaseDialect extends NacosDatabaseDialect {
public MagicDatabaseDialect() {
super(DatabaseNames.MAGICDATA);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mssql/MssqlDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mssql/MssqlDatabaseDialect.java
index 84661d061710e1fa98b954e0a2b8fb810a1b199e..ef68a5fecd53fa2fce17a1373079381dcd24d1b7 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mssql/MssqlDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mssql/MssqlDatabaseDialect.java
@@ -2,6 +2,7 @@ package com.jn.nacos.plugin.datasource.db.mssql;
import com.jn.langx.util.collection.Maps;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
import java.util.Map;
@@ -9,6 +10,7 @@ import java.util.Map;
public class MssqlDatabaseDialect extends NacosDatabaseDialect {
public MssqlDatabaseDialect() {
super(DatabaseNames.MSSQL);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mysql/MysqlDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mysql/MysqlDatabaseDialect.java
index 17cd3455ac06d8a08108a4537be9223cc9560fd1..97ab62bfa00b435a8db4ad05dfc9e98c00f114d6 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mysql/MysqlDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/mysql/MysqlDatabaseDialect.java
@@ -2,12 +2,14 @@ package com.jn.nacos.plugin.datasource.db.mysql;
import com.alibaba.nacos.plugin.datasource.enums.mysql.TrustedMysqlFunctionEnum;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class MysqlDatabaseDialect extends NacosDatabaseDialect {
public MysqlDatabaseDialect() {
super(DatabaseNames.MYSQL);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/oracle/OracleDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/oracle/OracleDatabaseDialect.java
index 6221c46fbb05c30d674c30c158ff6d7d6d095e50..4a517dc41d9f5bb36b831ea315d8267df3190917 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/oracle/OracleDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/oracle/OracleDatabaseDialect.java
@@ -1,13 +1,11 @@
package com.jn.nacos.plugin.datasource.db.oracle;
import com.jn.nacos.plugin.datasource.DatabaseNames;
-import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class OracleDatabaseDialect extends NacosDatabaseDialect {
public OracleDatabaseDialect(){
super(DatabaseNames.ORACLE);
- this.identifierQuotedMode = IdentifierQuotedMode.UNQUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/postgresql/PostgresDatabaseDialect.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/postgresql/PostgresDatabaseDialect.java
index 21ae63ac50800988acc3a99d7beca7d0f80989ab..ae51a90a323ac0e6396c3f25c3343f68478bfa92 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/postgresql/PostgresDatabaseDialect.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/db/postgresql/PostgresDatabaseDialect.java
@@ -1,11 +1,13 @@
package com.jn.nacos.plugin.datasource.db.postgresql;
import com.jn.nacos.plugin.datasource.DatabaseNames;
+import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
public class PostgresDatabaseDialect extends NacosDatabaseDialect {
public PostgresDatabaseDialect() {
super(DatabaseNames.POSTGRESQL);
+ this.identifierQuotedMode = IdentifierQuotedMode.QUOTED;
}
@Override
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/BaseMapper.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/BaseMapper.java
index 2d8645b5b70189d56f860145ee39318bbeb7e5f0..faae0a48f477180fbe9654a8e93e95be62dcc19d 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/BaseMapper.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/BaseMapper.java
@@ -1,108 +1,44 @@
package com.jn.nacos.plugin.datasource.mapper;
import com.alibaba.nacos.common.utils.NamespaceUtil;
-import com.alibaba.nacos.common.utils.VersionUtils;
import com.alibaba.nacos.plugin.datasource.constants.FieldConstant;
import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper;
import com.alibaba.nacos.plugin.datasource.model.MapperContext;
-import com.alibaba.nacos.sys.env.EnvUtil;
import com.jn.langx.util.Objs;
-import com.jn.langx.util.Preconditions;
import com.jn.langx.util.Strings;
import com.jn.langx.util.collection.Pipeline;
-import com.jn.langx.util.enums.Enums;
-import com.jn.nacos.plugin.datasource.DatabaseNames;
-import com.jn.nacos.plugin.datasource.IdentifierQuotedMode;
-import com.jn.nacos.plugin.datasource.NacosDatabaseDialect;
-import com.jn.nacos.plugin.datasource.NacosDatabaseDialectManager;
+import com.jn.nacos.plugin.datasource.*;
import com.jn.sqlhelper.dialect.Dialect;
-import com.jn.sqlhelper.dialect.DialectRegistry;
-
import java.util.List;
public abstract class BaseMapper extends AbstractMapper {
- private final String databaseName;
- protected NacosDatabaseDialect dialect;
- private IdentifierQuotedMode identifierQuotedModeInDDL;
-
protected BaseMapper() {
- this.databaseName = getConfiguredDatabaseName();
- Preconditions.checkTrue(!Objs.equals(DatabaseNames.UNSUPPORTED, this.databaseName), "database {} is unsupported", this.databaseName);
- this.dialect = NacosDatabaseDialectManager.getInstance().getDialect(this.databaseName);
- this.identifierQuotedModeInDDL = getConfiguredIdentifierQuotedMode();
- }
-
- /**
- * 当使用的 create-schema.sql, create-tables.sql 不是插件提供的,需要指定该配置。
- */
- private IdentifierQuotedMode getConfiguredIdentifierQuotedMode(){
- String modeString = EnvUtil.getProperty("db.sql.identifier.quoted.mode");
- IdentifierQuotedMode mode = null;
- if(Strings.isNotBlank(modeString)){
- mode = Enums.ofName(IdentifierQuotedMode.class, modeString);
- }
- if(mode==null){
- mode = this.dialect.getPluginProvidedDDLIdentifierQuotedMode();
- }
- if(mode==null){
- mode = IdentifierQuotedMode.QUOTED;
- }
- return mode;
- }
-
- private String getConfiguredDatabaseName(){
- String databaseName = EnvUtil.getProperty("spring.sql.init.platform");
- if(Strings.isBlank(databaseName)){
- // 这个是 nacos 中更早的配置 datasource 类型的方式
- databaseName = EnvUtil.getProperty("spring.datasource.platform");
- }
- if(Strings.isBlank(databaseName)){
- // 内嵌数据库 derby
- if (EnvUtil.getStandaloneMode()){
- databaseName = DatabaseNames.DERBY;
- }
- else{ // 默认数据库 MySQL
- databaseName = DatabaseNames.MSSQL;
- }
- }else{
- Dialect dialect = DialectRegistry.getInstance().gaussDialect(databaseName);
- if(dialect==null){
- databaseName = DatabaseNames.UNSUPPORTED;
- }
- }
-
- // 因为 mysql 不支持 在子查询中 的limit,所以 不使用自定义的SQL,而使用官方的插件
- if(Strings.isBlank(databaseName) || Objs.equals(DatabaseNames.DERBY, databaseName) || Objs.equals(DatabaseNames.MYSQL, databaseName)){
- databaseName = DatabaseNames.UNDEFINED;
- }
- return databaseName;
}
-
@Override
- public String getDataSource() {
- return databaseName;
+ public final String getDataSource() {
+ return PluginContext.INSTANCE.getDatabaseName();
}
- public NacosDatabaseDialect getDialect() {
- return dialect;
+ public final NacosDatabaseDialect getDialect() {
+ return PluginContext.INSTANCE.getDialect();
}
public String getIdentifierInDb(String identifier){
String string;
- switch (identifierQuotedModeInDDL){
+ switch (PluginContext.INSTANCE.getIdentifierQuotedModeInDDL()){
case QUOTED:
// 这个要求 DDL文件中,所有的表名、列名使用小写形式
- string = dialect.wrapQuote(identifier, Dialect.IdentifierCase.LOWER_CASE);
+ string = getDialect().wrapQuote(identifier, Dialect.IdentifierCase.LOWER_CASE);
break;
case UNQUOTED:
// 去掉引号
- string = dialect.unwrapQuote(identifier);
+ string = getDialect().unwrapQuote(identifier);
break;
case MIXED:
default:
// 按照数据库对未加引号的默认行为来处理
- string = dialect.wrapQuote(identifier, null);
+ string = getDialect().wrapQuote(identifier, null);
break;
}
return string;
@@ -110,7 +46,7 @@ public abstract class BaseMapper extends AbstractMapper {
@Override
public String getFunction(String functionName) {
- return this.dialect.getFunction(functionName);
+ return getDialect().getFunction(functionName);
}
/***************************************************************************
@@ -276,12 +212,6 @@ public abstract class BaseMapper extends AbstractMapper {
return sql.toString();
}
- protected boolean hasEncryptedDataKeyColumn(){
- String currentVersion = VersionUtils.version;
- String[] segments = Strings.split(currentVersion, ".");
- String nacosVersion = Strings.join(".", segments, 0, 3);
- return VersionUtils.compareVersion(nacosVersion, "2.1.0")>=0;
- }
private static final String NAMESPACE_PUBLIC_KEY = "public";
protected final String getDefaultTenantId(){
if(getDialect().isAutoCastEmptyStringToNull()){
diff --git a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/CommonConfigInfoBetaMapper.java b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/CommonConfigInfoBetaMapper.java
index 3140d54a8f1b238f2d4b5ea7a6bbbd6880f96cd9..d35adcee5d3da6999c48070a6a12e64a923eba87 100644
--- a/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/CommonConfigInfoBetaMapper.java
+++ b/nacosplugin-datasource/src/main/java/com/jn/nacos/plugin/datasource/mapper/CommonConfigInfoBetaMapper.java
@@ -4,6 +4,7 @@ import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoBetaMapper;
import com.alibaba.nacos.plugin.datasource.model.MapperContext;
import com.alibaba.nacos.plugin.datasource.model.MapperResult;
import com.jn.langx.util.collection.Lists;
+import com.jn.nacos.plugin.datasource.NacosEnvs;
import com.jn.sqlhelper.dialect.pagination.RowSelection;
import java.util.List;
@@ -21,7 +22,7 @@ public class CommonConfigInfoBetaMapper extends BaseMapper implements ConfigInfo
RowSelection rowSelection = new RowSelection(startRow, pageSize);
String subquery = "SELECT id FROM config_info_beta ORDER BY id ";
subquery = getDialect().getLimitSql(subquery, true, false, rowSelection);
- String sql = "SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips " + (hasEncryptedDataKeyColumn() ? ", encrypted_data_key ":"")
+ String sql = "SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips " + (NacosEnvs.hasEncryptedDataKeyColumn() ? ", encrypted_data_key ":"")
+ " FROM ( " + subquery + " )" + " g, config_info_beta t WHERE g.id = t.id";
List