Flowable 6.7.2 + Spring Boot 适配达梦数据库8 实践指南
国产化信创改造过程中,将 Flowable 工作流引擎从 MySQL 迁移到达梦数据库的完整记录。
一、背景
随着信创(国产化)在国内各行业的推进,达梦数据库(Dameng Database,DM8)作为国内主流的国产关系型数据库之一,正在逐步替换 MySQL、Oracle 等国外数据库。
Flowable 作为一款轻量级、可嵌入的工作流引擎,在企业级应用中广泛使用。但 Flowable 官方并未原生支持达梦数据库,因此迁移时需要做一些适配工作。
本文以Spring Boot 2.7.18 + Flowable 6.7.2为例,完整记录适配达梦数据库8 的过程。
二、环境版本
| 组件 | 版本 |
|---|---|
| Spring Boot | 2.7.18 |
| Flowable | 6.7.2 |
| 达梦数据库 | DM8 |
| JDK | 11 |
| JDBC 驱动 | DmJdbcDriver18(8.1.3.62) |
| 连接池 | Druid 1.2.23 |
三、核心适配原理
Flowable 的数据库方言机制
Flowable 内部使用 MyBatis 作为持久层框架。它通过databaseType属性来切换不同数据库的 SQL 方言,包括:
- DDL 建表语句(如字段类型、自增主键)
- 分页查询(如
LIMITvsROWNUM) - ID 生成策略(如
AUTO_INCREMENTvsSEQUENCE) - 日期函数(如
NOW()vsSYSDATE)
达梦的兼容模式
达梦数据库8 提供了多种兼容模式,最常见的是Oracle 兼容模式。在该模式下,达梦支持:
SELECT ... FROM DUALSYSDATE系统时间函数ROWNUM伪列分页SEQUENCE序列对象- PL/SQL 语法子集
核心思路:将 Flowable 的databaseType设为"oracle",利用达梦8 的 Oracle 兼容模式来执行 Flowable 生成的 Oracle 方言 SQL。
四、修改步骤
4.1 替换数据库驱动(pom.xml)
<!-- 移除 MySQL 驱动 --><!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> --><!-- 新增达梦数据库8 JDBC 驱动 --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.3.62</version></dependency>📌 注意:如果 Maven Central 无法直接下载(部分内网环境),需手动安装到本地仓库:
mvn install:install-file\-Dfile=DmJdbcDriver18.jar\-DgroupId=com.dameng\-DartifactId=DmJdbcDriver18\-Dversion=8.1.3.62\-Dpackaging=jar
驱动包可以从达梦数据库安装目录下的drivers/jdbc目录获取。
4.2 修改数据源配置(application.yml)
spring:datasource:type:com.alibaba.druid.pool.DruidDataSource# 达梦数据库8 驱动配置(请确保达梦数据库为 Oracle 兼容模式)driver-class-name:dm.jdbc.driver.DmDriverurl:jdbc:dm://localhost:5236/FLOWABLE_TEST?encoding=UTF-8username:SYSDBApassword:SYSDBAdruid:initial-size:5min-idle:5max-active:10# 达梦 Oracle 兼容模式下的验证查询validation-query:SELECT 1 FROM DUALtest-while-idle:truetest-on-borrow:falsetest-on-return:falsepool-prepared-statements:falsefilters:stat,wallflowable:async-executor-activate:truedatabase-schema-update:true# 首次启动自动建表4.3 新建 Flowable 达梦方言配置类
packagecom.wk.config;importorg.flowable.spring.boot.ProcessEngineConfigurationConfigurer;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassFlowableDamengConfig{@BeanpublicProcessEngineConfigurationConfigurerdamengProcessEngineConfigurer(){returnconfiguration->{// 告诉 Flowable 使用 Oracle 方言操作达梦(达梦 Oracle 兼容模式)configuration.setDatabaseType("oracle");// 自动建表/更新表结构configuration.setDatabaseSchemaUpdate("true");};}}五、达梦数据库准备
5.1 创建数据库
使用达梦管理工具(DM Manager)或 SQL 创建:
-- 创建表空间(可选)CREATETABLESPACEFLOWABLE_DATA DATAFILE'FLOWABLE_DATA.DBF'SIZE1024M;-- 创建用户并指定表空间CREATEUSERFLOWABLE_USER IDENTIFIEDBY"password"DEFAULTTABLESPACEFLOWABLE_DATA;-- 授予权限GRANTDBATOFLOWABLE_USER;5.2 设置 Oracle 兼容模式
达梦8 支持通过dminit初始化参数设置兼容模式,也可以在创建数据库时选择:
- 兼容模式选
Oracle(对应参数COMPATIBLE_MODE=1) - 字符集选
UTF-8 - VARCHAR 以字符为单位(
VARCHAR_TYPE=1,与 Oracle 行为一致)
如果没有在初始化时设置,也可以在建库后通过 SQL 临时设置:
-- 当前会话设置 Oracle 兼容模式SETCOMPATIBLE_MODE=ORACLE;建议:初始化数据库时就设为 Oracle 兼容模式,避免每次连接都需要手动设置。
六、验证迁移结果
6.1 启动项目
mvn clean spring-boot:run6.2 观察日志
启动成功后,日志中应能看到 Flowable 自动建表的 SQL 输出:
org.flowable.engine.impl.db.DbSqlSession : performing create on history with resource ... org.flowable.engine.impl.db.DbSqlSession : performing create on ACT_GE_PROPERTY ... ... Flowable 6.7.2 process engine created successfully6.3 检查数据库表
连接到达梦数据库,执行以下 SQL 确认表已创建:
-- 查看 Flowable 相关的所有表SELECTTABLE_NAMEFROMALL_TABLESWHERETABLE_NAMELIKE'ACT_%'ORDERBYTABLE_NAME;正常情况应看到类似以下 50+ 张表:
ACT_EVT_LOG ACT_GE_BYTEARRAY ACT_GE_PROPERTY ACT_HI_ACTINST ACT_HI_ATTACHMENT ACT_HI_COMMENT ACT_HI_DETAIL ACT_HI_IDENTITYLINK ACT_HI_PROCINST ACT_HI_TASKINST ACT_HI_VARINST ACT_ID_GROUP ACT_ID_MEMBERSHIP ACT_ID_USER ACT_PROCDEF_INFO ACT_RE_DEPLOYMENT ACT_RE_MODEL ACT_RE_PROCDEF ACT_RU_DEADLETTER_JOB ACT_RU_EVENT_SUBST ACT_RU_EXECUTION ACT_RU_IDENTITYLINK ACT_RU_JOB ACT_RU_SUSPENDED_JOB ACT_RU_TASK ACT_RU_TIMER_JOB ACT_RU_VARIABLE ...6.4 简单流程测试
部署一个简单的 BPMN 流程定义并启动流程实例,验证读写操作正常:
@AutowiredprivateRuntimeServiceruntimeService;@TestvoidtestStartProcess(){// 部署流程Deploymentdeployment=repositoryService.createDeployment().addClasspathResource("processes/simple-approval.bpmn20.xml").deploy();// 启动流程ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("simpleApproval");Assertions.assertNotNull(processInstance.getId());}七、常见问题排查
Q1:java.sql.SQLException: 表或视图不存在
原因:Flowable 使用 Oracle 方言执行建表 DDL,但达梦数据库未正确设置 Oracle 兼容模式。
解决:确认达梦数据库已开启 Oracle 兼容模式,或者在连接 URL 中添加参数:
jdbc:dm://localhost:5236/FLOWABLE_TEST?encoding=UTF-8&oracleMode=trueQ2:org.flowable.common.engine.api.FlowableException: couldn't deduct database type
原因:Flowable 无法识别达梦数据库类型,自动检测返回空值。
解决:确认已配置ProcessEngineConfigurationConfigurer并设置了databaseType("oracle")。
Q3: 序列ACT_ID_SEQ重复或唯一约束冲突
原因:Flowable 的 Oracle 模式下依赖序列生成 ID,如果表结构中序列未正确创建。
解决:删除所有ACT_表,设置database-schema-update: true重新生成。如仍出问题,可手动创建序列:
CREATESEQUENCE ACT_ID_SEQSTARTWITH1INCREMENTBY1CACHE20;八、总结
| 迁移项 | 操作要点 |
|---|---|
| JDBC 驱动 | DmJdbcDriver18,注意 JDK 版本选择 |
| 连接 URL | jdbc:dm://host:port/database?encoding=UTF-8 |
| 验证查询 | Oracle 模式用SELECT 1 FROM DUAL |
| Flowable 方言 | databaseType = "oracle"(通过配置类编程设置) |
| 达梦设置 | 必须开启 Oracle 兼容模式 |
| 连接池 | Druid 配置中pool-prepared-statements: false |
Flowable 通过databaseType切换 SQL 方言这一设计,使得非原生支持的数据库也能通过"方言兼容"的方式平滑迁移。达梦8 的 Oracle 兼容模式在语法覆盖上做得相当成熟,Flowable 在迁移过程中几乎没有遇到 SQL 不兼容的问题——核心工作量只是替换驱动 + 配置数据源 + 声明数据库类型这三步。
当然,如果后续 Flowable 官方能直接支持达梦数据库类型(dm),那将是最完美的方案——不需要借助 Oracle 兼容模式,直接用达梦自身的 SQL 方言和特性。
—效果截图
本文涉及的完整代码已托管在项目仓库中,欢迎参考指正。