国产信创数据库(DM 达梦、大金、OpenGauss、瀚高、OceanBase、TongRDS)
# 1. DM 达梦数据库
# 1.1 如何安装?
可以使用 Windows 或 Docker 等多种方式。
注意,目前我们使用的是 DM 8.0 的版本。
# 1.1 Windows 方式
① 访问 https://eco.dameng.com/download/ (opens new window) 地址,点击“开发版 (X86平台)”选项,进行下载。
② 傻瓜式安装、数据库实例化,一路下去就好,不用修改任何参数。
# 1.2 Docker 方式
① 访问 https://eco.dameng.com/download/ (opens new window) 地址,点击“Docker 镜像”选项,进行下载。
② 执行如下脚本,启动 Docker 服务:
docker load -i dm8_20240715_x86_rh6_rq_single.tar
docker run -d -p 5236:5236 \
--restart=unless-stopped \
--name dm8_test \
--privileged=true \
-e PAGE_SIZE=16 \
-e LD_LIBRARY_PATH=/opt/dmdbms/binn \
-e EXTENT_SIZE=32 \
-e BLANK_PAD_MODE=1 \
-e LOG_SIZE=1024 \
-e UNICODE_FLAG=1 \
-e LENGTH_IN_CHAR=1 \
-e INSTANCE_NAME=dm8_test \
-v $PWD/dm8_test:/opt/dmdbms/data \
dm8_single:dm8_20240715_rev232765_x86_rh6_64
备注:可以尝试使用大小写不敏感配置 -e CASE_SENSITIVE=N。需要停止并删除容器后,删除 dm8_test 目录,重新docker run。
# 1.2 如何导入数据?
使用 DM 管理工具 (opens new window) 进行数据的导入。如果你不是很了解,已可以看看文档:
具体步骤如下:
① 使用 DM 管理工具,新建一个名字为 RUOYI_VUE_PRO 的 schema 模式。如下图所示:

为什么名字是 RUOYI_VUE_PRO 呢?
因为稍后使用的 sql/dm/ruoyi-vue-pro-dm8.sql 文件,使用的 schema 是它噢。后续跑通了,你可以按照自己的修改。
② 点击 DM 管理工具的 [执行 -> 执行脚本] 菜单,选中项目中的 sql/dm/ruoyi-vue-pro-dm8.sql 文件,之后点击 [绿色箭头] 进行执行即可。
友情提示:如果你不想 DM 管理工具,也可以使用其它工具:
# 1.3 如何启动项目?
① 修改 yudao-spring-boot-starter-mybatis 模块的 pom.xml 文件,将 DM 依赖的 DmJdbcDriver18 的 optional 移除(注意,需要使用 IDEA 刷新下 Maven 的依赖)。如下图所示:

② 修改 application-local.yaml 配置文件,将数据库的 url、username、password 修改为 DM 数据库。例如说:

③ 后续启动项目,就可以了。
疑问:启动报“无效的模式名[RUOYI_VUE_PRO]”错误,怎么解决?
可以把上图的 url 中的 ?schema=RUOYI_VUE_PRO 部分去掉后,再重启下,试试看。
# 1.4 常见问题?
# 1.4.1 大小写敏感?
参考 《详解 DM 数据库字符串大小写敏感》 (opens new window) 文档
# 1.4.2 Quartz 定时任务?
Quartz 定时任务,已经适配,直接参考 《定时任务》 使用。
实现思路非常简单:
- Quartz 初始化使用
tables_oracle(opens new window) 脚本,去掉前面的delete和drop部分 spring.quartz.properties.org.quartz.jobStore.driverDelegateClass使用org.quartz.impl.jdbcjobstore.StdJDBCDelegate类。不过网上也有人说使用org.quartz.impl.jdbcjobstore.oracle.OracleDelegate类,我暂时没跑成功
# 1.4.3 Flowable 工作流?
Flowable 工作流的适配,可参考 《工作流(达梦适配)》。
短期内暂时没时间适配,欢迎你搞了之后,pull request 贡献给项目,从而帮助到更多人!
# 2. KingbaseES 大金数据库
# 1.1 如何安装?
可以使用 Windows 或 Docker 等多种方式。
注意,目前我们使用的是 V008R006C008B0020 的版本。
# 1.1 Windows 方式
# 1.2 Docker 方式
① 访问 https://www.kingbase.com.cn/xzzx/index.htm (opens new window) 地址,点击左侧的“软件版本 -> 数据库” 菜单,再点击“docker镜像”选项,进行下载:
- x86_64 版本 (opens new window) 【Windows 选择这个】
- aarch64 版本 (opens new window) 【MacBook Apple Silicon 选择这个】
② 执行如下脚本,启动 Docker 服务:
docker load -i kdb_x86_64_V009R001C001B0025.tar
docker run -d -p 54321:54321 \
--restart=unless-stopped \
--name kingbase_test \
--privileged=true \
-e NEED_START=yes \
-e DB_USER=root \
-e DB_PASSWORD=123456 \
-e DB_MODE=oracle \
kingbase_v009r001c001b0025_single_x86:v1
# 2.2 如何导入数据?
① 使用 Navicat 工具,选择 PostgreSQL 数据库,即可连接。如下图所示:

② 选择 test 数据库的 public 模式,右键选择“运行 SQL 文件”,选择项目中的 sql/kingbasees/ruoyi-vue-pro.sql 文件,之后点击 [开始] 按钮。
# 2.3 如何启动项目?
① 修改 yudao-spring-boot-starter-mybatis 模块的 pom.xml 文件,将 KingbaseES 依赖的 kingbasees-jdbc 的 optional 移除(注意,需要使用 IDEA 刷新下 Maven 的依赖)。如下图所示:

② 修改 application-local.yaml 配置文件,将数据库的 url、username、password 修改为 KingbaseES 数据库。例如说:

③ 后续启动项目,就可以了。
# 2.4 常见问题?
# 2.4.1 Quartz 定时任务?
Quartz 定时任务,已经适配,直接参考 《定时任务》 使用。
实现思路非常简单:
- Quartz 初始化使用
tables_postgres(opens new window) 脚本 spring.quartz.properties.org.quartz.jobStore.driverDelegateClass使用org.quartz.impl.jdbcjobstore.StdJDBCDelegate类。
# 2.4.2 Flowable 工作流?
Flowable 工作流的适配,可参考如下文章:
- 《球友基于 AI + 文档适配成功》 (opens new window)
- 《flowable 6.7.2 在 spring boot 项目中兼容人大金仓》 (opens new window)
- 《flowable 适配人大金仓 Kingbase 数据库》 (opens new window)
- 《【Kingbase8 数据库】flowable兼容人大金仓 Kingbase8 过程》 (opens new window)
短期内暂时没时间适配,欢迎你搞了之后,pull request 贡献给项目,从而帮助到更多人!
# 3. 华为 OpenGauss
# 3.1 如何安装?
可以使用 Linux 或 Docker 等多种方式。
注意,目前我们使用的是 openGauss 5.0.0 的版本。
友情提示:openGauss 不支持 Windows 系统,所以请使用 Linux 或 Docker 等方式。
# 3.1 Docker 方式
执行如下脚本,启动 Docker 服务:
docker run -d \
--name opengauss-test \
--restart unless-stopped \
-e GS_USERNAME=root \
-e GS_PASSWORD=Yudao@2024 \
-e LD_LIBRARY_PATH=/usr/local/opengauss/lib:/usr/lib \
-p 5432:5432 \
opengauss/opengauss:5.0.0
# 3.2 如何导入数据?
① 参考 《用 JetBrains DataGrip 连接 Huawei openGauss》 (opens new window) 文档,连接 openGauss 数据库。
疑问:为什么不使用 Navicat 进行连接?
因为 Navicat 不支持 openGauss 数据库,而使用 PostgreSQL 进行连接,会出现 “none of the server's SASL authentication mechanisms are supported” 报错。
② 选择 postgres 数据库,右键选择“SQL Scripts -> Run SQL Script...”,选择项目中的 sql/opengauss/ruoyi-vue-pro.sql 文件,之后执行。
# 3.3 如何启动项目?
① 修改 yudao-spring-boot-starter-mybatis 模块的 pom.xml 文件,将 openGauss 依赖的 opengauss 的 optional 移除(注意,需要使用 IDEA 刷新下 Maven 的依赖)。如下图所示:

② 修改 application-local.yaml 配置文件,将数据库的 url、username、password 修改为 openGauss 数据库。例如说:

::: 疑问:为什么 jdbc 使用 postgres 数据库连接?
因为 openGauss 是兼容 PostgreSQL 的,所以 JDBC 驱动使用的是 org.postgresql.Driver。这样,后续和 Quartz 定时任务、Flowable 工作流等等,都是可以兼容的。
:::
③ 后续启动项目,就可以了。
# 3.4 常见问题?
# 3.4.1 Quartz 定时任务?
Quartz 定时任务,已经适配,直接参考 《定时任务》 使用。
实现思路非常简单(因为 jdbc 使用 postgres 数据库连接):
- Quartz 初始化使用
tables_postgres(opens new window) 脚本
# 3.4.2 Flowable 工作流?
Flowable 工作流,已经适配,直接参考 《工作流》 使用。
也是因为 jdbc 使用 postgres 数据库连接,所以无需去兼容。
# 4. HighGo 瀚高数据库
# 4.1 如何安装?
可以使用 Linux 或 Docker 等多种方式。
注意,目前项目按照 PostgreSQL 兼容模式适配瀚高数据库。
# 4.1 Docker 方式
① 下载瀚高官方 Docker 镜像,并加载镜像文件。加载后,将镜像打成本地标签:
docker load -i <highgo-image>.tar
docker tag <image>:<tag> highgo:local
② 在项目 sql/tools 目录下运行:
docker compose up -d highgo
注意:不同瀚高镜像的数据目录可能不同,如果容器无法启动,请按镜像实际
PGDATA修改docker-compose.yaml中的highgo数据卷挂载目录。
③ 启动完成后,需要手动导入 Quartz 和项目 SQL。瀚高兼容 PostgreSQL,具体客户端命令以当前镜像为准,可使用 psql 或瀚高镜像内置的兼容客户端执行 /tmp/quartz.sql、/tmp/schema.sql。
# 4.2 如何导入数据?
① 使用 DataGrip、DBeaver 等数据库工具,选择 PostgreSQL 数据库类型,连接瀚高数据库。
② 先执行项目中的 sql/highgo/quartz.sql 文件,再执行 sql/highgo/ruoyi-vue-pro.sql 文件。
友情提示
瀚高数据库兼容 PostgreSQL,所以项目 SQL、Quartz、Flowable 都按照 PostgreSQL 兼容模式处理。
# 4.3 如何启动项目?
① 项目已经在 yudao-server/pom.xml 引入 PostgreSQL JDBC 驱动。若你裁剪过依赖,请确认最终运行包包含 org.postgresql:postgresql 依赖。例如说:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
② 修改 application-local.yaml 配置文件,将数据库的 url、username、password 修改为瀚高数据库。例如说:
spring:
datasource:
dynamic:
druid:
validation-query: SELECT 1
datasource:
master:
url: jdbc:postgresql://127.0.0.1:5866/ruoyi-vue-pro
driver-class-name: org.postgresql.Driver
username: root
password: 123456
注意,如果本地配置里 validation-query 仍然是 SELECT 1 FROM DUAL,需要改成 SELECT 1,否则 PostgreSQL/瀚高会因为不存在 DUAL 表导致连接校验失败。
疑问:为什么 jdbc 使用 postgres 数据库连接?
因为瀚高数据库兼容 PostgreSQL,所以 JDBC 驱动使用的是 org.postgresql.Driver。这样,后续和 Quartz 定时任务、Flowable 工作流等等,都是可以兼容的。
③ 后续启动项目,就可以了。
# 4.4 常见问题?
# 4.4.1 Quartz 定时任务?
Quartz 定时任务,已经适配,直接参考 《定时任务》 使用。
实现思路非常简单(因为 jdbc 使用 postgres 数据库连接):
- Quartz 初始化使用
tables_postgres(opens new window) 脚本
# 4.4.2 Flowable 工作流?
Flowable 工作流,已经适配,直接参考 《工作流》 使用。
也是因为 jdbc 使用 postgres 数据库连接,所以无需去兼容。
# 5. OceanBase 数据库
# 5.1 如何安装?
可以使用 Linux 或 Docker 等多种方式。
注意,目前我们使用的是 OceanBase 社区版 4.4.2.1 的 MySQL 模式。
# 5.1 Docker 方式
在项目 sql/tools 目录下运行:
docker compose up -d --wait --wait-timeout 300 oceanbase
注意:Docker 建议至少分配 8 GB 内存;同时运行 MySQL、Elasticsearch 等服务时,建议分配 12 GB 或更多。启动失败时,可执行
docker compose logs oceanbase,检查内存和租户初始化日志。
# 5.2 如何导入数据?
① 使用 DataGrip、DBeaver 等数据库工具,选择 MySQL 数据库类型,连接 OceanBase 数据库。默认地址为 127.0.0.1:2881,账号为 root@test,密码为 123456。
② 创建一个名字为 ruoyi-vue-pro、字符集为 utf8mb4 的数据库,依次执行项目中的 sql/oceanbase/ruoyi-vue-pro.sql、sql/oceanbase/quartz.sql 文件。
友情提示:如果使用 Docker,也可以直接导入:
在项目 sql/tools 目录下运行,自动创建数据库并导入上述 SQL 文件:
docker compose exec oceanbase bash /tmp/create_schema.sh
注意,导入脚本会重建同名表,仅用于初始化测试数据库。
# 5.3 如何启动项目?
① 项目已经引入 MySQL JDBC 驱动,无需新增 OceanBase 驱动依赖。
② 修改 application-local.yaml 配置文件,将数据库的 url、username、password 修改为 OceanBase 数据库。例如说:
spring:
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://127.0.0.1:2881/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
username: root@test
password: 123456
注意,root@test 连接的是 MySQL 模式的 test 租户。如果配置了 slave 等多个数据源,也需要同步修改对应配置。
疑问:为什么 jdbc 使用 mysql 数据库连接?
因为 OceanBase 的 MySQL 模式兼容 MySQL 协议,所以 JDBC 驱动使用的是 com.mysql.cj.jdbc.Driver,初始化 SQL 也直接复用 MySQL 脚本。
③ 后续启动项目,就可以了。
# 5.4 常见问题?
# 5.4.1 Quartz 定时任务?
Quartz 的初始化 SQL 已验证可以导入,对应项目中的 sql/oceanbase/quartz.sql 文件。使用方式可参考 《定时任务》。
# 5.4.2 Flowable 工作流?
Flowable 工作流,已经适配,直接参考 《工作流》 使用。
也是因为 jdbc 使用 mysql 数据库连接,所以无需去兼容。
# 6. 东方通 TongRDS 缓存
TongRDS 用于替换 Redis,提供缓存、登录令牌、分布式锁、限流和消息等能力。它不替换 MySQL 等关系型数据库,也不需要导入项目 SQL。
TongWeb、TongHttpServer 的部署,可参考 《东方通服务器部署》。
# 6.1 如何安装?
可以使用 Linux 或 Docker 等多种方式。安装介质、授权和配置说明,可通过 东方通官方资料中心 (opens new window) 获取。授权缺失或过期时,需要获取对应版本的有效授权。
注意,本节使用的是第三方公开镜像中的 TongRDS 2.2.1.3 Lite。
# 6.1 Docker 方式
① 创建 JVM 参数文件,将堆上限设置为 2 GB:
mkdir -p tongrds-test
cat > tongrds-test/external.vmoptions <<'EOF'
-Xms128m
-Xmx2g
-server
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
EOF
② 执行如下命令,创建并启动测试容器:
docker create --name tongrds-test --platform linux/amd64 \
--memory 3g --memory-swap 3g \
-p 127.0.0.1:16381:6379 \
snapcastify/tongrds@sha256:beedc840193aa6a884c303833a7e412f26a3ceee5e2c1252bd04b618fc8d8946
docker cp tongrds-test/external.vmoptions tongrds-test:/opt/pmemdb/bin/external.vmoptions
docker start tongrds-test
docker logs tongrds-test
该 公开镜像 (opens new window) 是 AMD64 架构,Apple Silicon 使用 Docker 的模拟运行能力。镜像内的 TongRDS 使用 JDK 8,与后端应用的 JDK 版本独立。
③ 使用 redis-cli 检查连接和版本:
REDISCLI_AUTH=123456 redis-cli -h 127.0.0.1 -p 16381 PING
REDISCLI_AUTH=123456 redis-cli -h 127.0.0.1 -p 16381 INFO server
PING 应返回 PONG,INFO server 应显示 TongRDS 的版本和授权模式。默认密码为 123456,上述端口只绑定本机,用于测试;正式部署需要按产品说明配置密码、网络和数据持久化。
# 6.2 如何启动项目?
① 修改 application-local.yaml 中的 Redis 地址和密码,保留原有关系型数据库配置:
spring:
data:
redis:
host: 127.0.0.1
port: 16381
database: 0
password: ${TONGRDS_PASSWORD}
以上适用于 Spring Boot 3.x 项目;Spring Boot 2.x 项目使用 spring.redis 配置前缀。
② 设置 TONGRDS_PASSWORD=123456 后启动项目。后端位于 Docker 容器内时,请使用 TongRDS 的容器网络地址,不能使用后端容器自身的 127.0.0.1。
项目继续使用现有 Redis 客户端依赖,不需要添加 TongRDS JDBC 驱动。
# 6.3 常见问题?
# 6.3.1 空 pending 报错?
TongRDS 2.2.1.3 在消费组没有待处理消息时,XPENDING 返回 RESP 错误 -null,导致 opsForStream().pending() 抛出 InvalidDataAccessApiUsageException,影响项目的待处理消息重发任务。
可以在 yudao-server 模块的 cn.iocoder.yudao.server.config 包中增加如下连接工厂,只兼容该特定响应。非空摘要继续使用原 Redisson 实现;异常响应还需要通过原始 XINFO GROUPS 确认消费组存在、待处理数量确实为零。
友情提示
下面的代码在 Redisson 4.7.0、redisson-spring-data-35 上验证通过,用于处理 TongRDS 2.2.1.3 的空 pending 响应。
查看完整兼容代码
package cn.iocoder.yudao.server.config;
import org.redisson.api.RedissonClient;
import org.redisson.client.RedisException;
import org.redisson.client.codec.StringCodec;
import org.redisson.client.protocol.RedisCommand;
import org.redisson.client.protocol.decoder.ListMultiDecoder2;
import org.redisson.client.protocol.decoder.ObjectListReplayDecoder;
import org.redisson.spring.data.connection.RedissonConnection;
import org.redisson.spring.data.connection.RedissonConnectionFactory;
import org.redisson.spring.data.connection.RedissonStreamCommands;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStreamCommands;
import org.springframework.data.redis.connection.stream.PendingMessagesSummary;
import java.util.Collections;
import java.util.List;
public class TongRdsConnectionFactory extends RedissonConnectionFactory {
private final RedissonClient client;
public TongRdsConnectionFactory(RedissonClient client) {
super(client);
this.client = client;
}
@Override
public RedisConnection getConnection() {
return new RedissonConnection(client, isFilterOkResponses()) {
@Override
public RedisStreamCommands streamCommands() {
return new RedissonStreamCommands(this, redisson.getCommandExecutor()) {
@Override
public PendingMessagesSummary xPending(byte[] key, String groupName) {
try {
return super.xPending(key, groupName);
} catch (DataAccessException ex) {
Throwable cause = ex.getMostSpecificCause();
if (!(cause instanceof RedisException) || cause.getMessage() == null
|| !cause.getMessage().startsWith("null. channel:")) {
throw ex;
}
List<List<Object>> groups = sync(redisson.getCommandExecutor().readAsync(key,
StringCodec.INSTANCE, new RedisCommand<List<List<Object>>>("XINFO", "GROUPS",
new ListMultiDecoder2(new ObjectListReplayDecoder<>(), new ObjectListReplayDecoder<>())), key));
boolean empty = groups.stream().anyMatch(group -> isEmptyGroup(group, groupName));
if (!empty) {
throw ex;
}
return new PendingMessagesSummary(groupName, 0,
org.springframework.data.domain.Range.unbounded(), Collections.emptyMap());
}
}
};
}
};
}
private static boolean isEmptyGroup(List<Object> fields, String groupName) {
String name = null;
Long pending = null;
for (int i = 0; i + 1 < fields.size(); i += 2) {
if ("name".equals(fields.get(i))) {
name = fields.get(i + 1).toString();
} else if ("pending".equals(fields.get(i))) {
pending = Long.valueOf(fields.get(i + 1).toString());
}
}
return groupName.equals(name) && Long.valueOf(0).equals(pending);
}
}
再增加 TongRdsConfiguration 配置类:
package cn.iocoder.yudao.server.config;
import org.redisson.api.RedissonClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "yudao.tongrds.enabled", havingValue = "true")
public class TongRdsConfiguration {
@Bean
public TongRdsConnectionFactory redisConnectionFactory(RedissonClient client) {
return new TongRdsConnectionFactory(client);
}
}
最后,在对应环境的配置文件中启用:
yudao:
tongrds:
enabled: true