从 MySQL 切到达梦:万村乐数字乡村的信创适配路线与兼容实战
政务类系统上信创,是最近两年绕不开的硬指标。万村乐数字乡村 Java 版默认跑在 MySQL 8.0.28 上,但客户真正部署到区县政务云时,经常要求数据库换成国产的达梦(DM),操作系统换成国产发行版,密码算法改用国密 SM2/SM4。这篇文章记录的就是这套系统在做信创适配时,实际改了哪些、哪些不用动。
底层技术栈先交代清楚:Jdk 1.8、SpringBoot 2.5.4、MybatisPlus 3.5.1、SaToken 1.30.0、Hutool 5.7.22、Druid 1.2.8。可视化大数据平台一侧,数据源管理明确支持 MySQL、达梦、MongoDB、PostgreSQL、Oracle 这些主流及国产数据库,外加 API 数据源。也就是说,多数据库并不是临时抱佛脚,而是架构一开始就留了口子。
一、数据库驱动与连接池切换
信创的第一步是换驱动。MySQL 用com.mysql.cj.jdbc.Driver,达梦用DmJdbcDriver18,两者在 Druid 1.2.8 里都是标准数据源,切换只发生在配置层,业务代码一行不用改:
这里有个容易翻车的点:达梦的端口默认是 5236,不是 MySQL 的 3306;字符集要显式指定UTF-8,否则中文村庄名容易乱码。Druid 的validationQuery也要从 MySQL 的SELECT 1改成达梦认可的SELECT 1 FROM DUAL,否则连接探活会一直报错把连接池打挂。
二、MybatisPlus 的分页方言
系统里大量列表查询依赖 MybatisPlus 3.5.1 的分页插件。国产库的适配关键在DbType:
DbType.DM这个枚举 MybatisPlus 是原生支持的,换成达梦后分页 SQL 会自动从LIMIT ?,?改写成达梦的ROW_NUMBER() OVER(...)写法。只要 CRUD 走的是 MybatisPlus 的Wrapper和BaseMapper,基本不用手写方言 SQL,这一层就平滑过渡了。
三、SQL 方言差异是真正的工作量
框架能兜住分页,但手写 XML 里的函数和关键字得人工过一遍。我们实际踩过的差异主要有三类:
- 分页与LIMIT:达梦不支持LIMIT,必须改写成ROWNUM或窗口函数,上面靠 MybatisPlus 自动处理,手写 SQL 得自己改; - 自增主键:AUTO_INCREMENT在达梦对应的是序列(SEQUENCE)+ 触发器,建表脚本不能直接拷; - 关键字冲突:MySQL 里常用作列名的comment、order、level在达梦里可能是保留字,得加双引号或改名; - 日期函数:NOW()、DATE_FORMAT()要换成SYSDATE、TO_CHAR(),字符串拼接CONCAT在达梦对参数个数更严格。
我们最终的做法是把所有手写 SQL 收敛到一个dialect模块,按DbType加载不同版本的 mapper,MySQL 和达梦各一套,CI 里挂两个库的集成测试,谁改坏了谁负责。
四、国密 SM2/SM4 的接入
信创环境对密码算法有明确要求,不能用国际算法裸奔敏感数据。万村乐后端带了sm-crypto/Smcrypto 0.3.2这类国密实现,用于村民身份、支付回调等关键字段的加解密。SM4 做对称加密,SM2 做非对称签名与密钥交换:
这里要注意密钥不能硬编码,生产上密钥从 KMS 或配置中心拉,密钥轮换走配置下发而不是发版。SaToken 1.30.0 管的是登录态,国密管的是落盘与传输的字段安全,两者职责不同,不要混为一谈。SM4 的密钥长度是固定的 128 位,分组也是 128 位;SM2 基于 256 位椭圆曲线(Fp-256),公钥 64 字节、签名 64 字节,这些参数和 RSA 完全不同,对接旧系统做签名验签时务必对齐,否则会出现「算法都对但就是验不过」的低级故障。
在部署完成后,我们会跑一条基线检查:确认 Druid 连的是达梦驱动、MybatisPlus 的DbType是 DM、国密工具能正常加解密、通知公告的阅读回执聚合在国产库上跑通。四条全绿才允许上线。
五、结构迁移与数据同步怎么落地
驱动和方言改完,下一步是把存量数据从 MySQL 8.0.28 迁到账梦。结构迁移我们用达梦自带的 DTS(数据迁移工具)先把表结构反向工程出来,但自动生成的 DDL 往往带着 MySQL 习惯,比如把BIGINT AUTO_INCREMENT直接丢了自增属性。我们的处理是写一层迁移脚本,把自增统一改成序列:
数据同步分全量和增量两段。全量在停写窗口用 DTS 一次性倒,增量靠解析 MySQL 的 binlog 或者直接用系统的定时任务双写兜底,迁完跑一轮行数和对账 SQL 才算收口:
六、多租户隔离在国产库下照样成立
前面几篇提过,万村乐用 MybatisPlus 的TenantLineInnerInterceptor做行级隔离,每个查询自动拼village_id。切到达梦后这套机制依然成立,因为拼的是普通WHERE条件,不依赖 MySQL 特有语法。我们专门在达梦上补了一组集成测试,覆盖sys_region、sys_dict、sys_config这几张 tenant 忽略表之外所有业务表的隔离正确性,确认一个村的查询不会漏出另一个村的数据。
七、操作系统与运行时的适配
国产操作系统(政务云常见的麒麟、统信 UOS 都属于这一档)底层基本是 Linux,Jdk 1.8 的兼容性没问题,真正要调的是两件事:一是字体,大屏导出图片时中文容易变方框,得预装wqy-zenhei之类字体包;二是文件存储路径,系统支持本地、阿里云、腾讯云三种存储,私有化部署在国产 OS 上多用本地盘或对象存储网关,这块靠配置切换,不碰业务代码。
八、灰度切换与回滚
生产环境不能一把梭。我们的切换顺序是先双库并行:新村子直接建在达梦上,老村子暂留 MySQL,通过配置中心按village_id路由数据源。观察两周,确认达梦侧的政务公开、通知公告、积分商城的读写都正常,再把存量数据迁过去、把路由切干净。回滚也很简单,路由配置改回 MySQL 即可,因为两套库在并行期都保留着可读状态。
小结
信创适配不是把数据库换成国产就完事,真正的工作量在 SQL 方言、驱动参数、国密接入和运行时环境四块。万村乐这套系统因为架构上早就支持多数据源(MySQL、达梦、MongoDB、PostgreSQL、Oracle 都在可视化平台的数据源清单里),又用 MybatisPlus 统一了分页与多租户,迁移成本被压到了可接受范围。对我们这类做政务私有化部署的团队来说,信创不是一次性项目,而是每次交付都要跑一遍的兼容性检查清单。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)