
Flowable 6.7.2 Spring Boot 适配达梦数据库8 实践指南国产化信创改造过程中将 Flowable 工作流引擎从 MySQL 迁移到达梦数据库的完整记录。一、背景随着信创国产化在国内各行业的推进达梦数据库Dameng DatabaseDM8作为国内主流的国产关系型数据库之一正在逐步替换 MySQL、Oracle 等国外数据库。Flowable 作为一款轻量级、可嵌入的工作流引擎在企业级应用中广泛使用。但 Flowable 官方并未原生支持达梦数据库因此迁移时需要做一些适配工作。本文以Spring Boot 2.7.18 Flowable 6.7.2为例完整记录适配达梦数据库8 的过程。二、环境版本组件版本Spring Boot2.7.18Flowable6.7.2达梦数据库DM8JDK11JDBC 驱动DmJdbcDriver188.1.3.62连接池Druid 1.2.23三、核心适配原理Flowable 的数据库方言机制Flowable 内部使用 MyBatis 作为持久层框架。它通过databaseType属性来切换不同数据库的 SQL 方言包括DDL 建表语句如字段类型、自增主键分页查询如LIMITvsROWNUMID 生成策略如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 groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency --!-- 新增达梦数据库8 JDBC 驱动 --dependencygroupIdcom.dameng/groupIdartifactIdDmJdbcDriver18/artifactIdversion8.1.3.62/version/dependency 注意如果 Maven Central 无法直接下载部分内网环境需手动安装到本地仓库mvn install:install-file\-DfileDmJdbcDriver18.jar\-DgroupIdcom.dameng\-DartifactIdDmJdbcDriver18\-Dversion8.1.3.62\-Dpackagingjar驱动包可以从达梦数据库安装目录下的drivers/jdbc目录获取。4.2 修改数据源配置application.ymlspring:datasource:type:com.alibaba.druid.pool.DruidDataSource# 达梦数据库8 驱动配置请确保达梦数据库为 Oracle 兼容模式driver-class-name:dm.jdbc.driver.DmDriverurl:jdbc:dm://localhost:5236/FLOWABLE_TEST?encodingUTF-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 DATAFILEFLOWABLE_DATA.DBFSIZE1024M;-- 创建用户并指定表空间CREATEUSERFLOWABLE_USER IDENTIFIEDBYpasswordDEFAULTTABLESPACEFLOWABLE_DATA;-- 授予权限GRANTDBATOFLOWABLE_USER;5.2 设置 Oracle 兼容模式达梦8 支持通过dminit初始化参数设置兼容模式也可以在创建数据库时选择兼容模式选Oracle对应参数COMPATIBLE_MODE1字符集选UTF-8VARCHAR 以字符为单位VARCHAR_TYPE1与 Oracle 行为一致如果没有在初始化时设置也可以在建库后通过 SQL 临时设置-- 当前会话设置 Oracle 兼容模式SETCOMPATIBLE_MODEORACLE;建议初始化数据库时就设为 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_NAMELIKEACT_%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(){// 部署流程DeploymentdeploymentrepositoryService.createDeployment().addClasspathResource(processes/simple-approval.bpmn20.xml).deploy();// 启动流程ProcessInstanceprocessInstanceruntimeService.startProcessInstanceByKey(simpleApproval);Assertions.assertNotNull(processInstance.getId());}七、常见问题排查Q1:java.sql.SQLException: 表或视图不存在原因Flowable 使用 Oracle 方言执行建表 DDL但达梦数据库未正确设置 Oracle 兼容模式。解决确认达梦数据库已开启 Oracle 兼容模式或者在连接 URL 中添加参数jdbc:dm://localhost:5236/FLOWABLE_TEST?encodingUTF-8oracleModetrueQ2:org.flowable.common.engine.api.FlowableException: couldnt 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 版本选择连接 URLjdbc:dm://host:port/database?encodingUTF-8验证查询Oracle 模式用SELECT 1 FROM DUALFlowable 方言databaseType oracle通过配置类编程设置达梦设置必须开启 Oracle 兼容模式连接池Druid 配置中pool-prepared-statements: falseFlowable 通过databaseType切换 SQL 方言这一设计使得非原生支持的数据库也能通过方言兼容的方式平滑迁移。达梦8 的 Oracle 兼容模式在语法覆盖上做得相当成熟Flowable 在迁移过程中几乎没有遇到 SQL 不兼容的问题——核心工作量只是替换驱动 配置数据源 声明数据库类型这三步。当然如果后续 Flowable 官方能直接支持达梦数据库类型dm那将是最完美的方案——不需要借助 Oracle 兼容模式直接用达梦自身的 SQL 方言和特性。—效果截图本文涉及的完整代码已托管在项目仓库中欢迎参考指正。