尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flowable适配达梦8数据库:完整集成方案与踩坑实践

Flowable适配达梦8数据库:完整集成方案与踩坑实践 简介围绕Flowable工作流引擎与达梦8国产数据库深度集成而整理的资源包适合正在推进业务流程管理系统国产化改造的Java开发、架构人员。内容系统梳理了从JDK、SpringBoot环境准备、Maven依赖引入到数据源配置、Flowable引擎初始化、表结构创建再到异常处理、性能优化与安全合规等环节的关键操作并结合达梦8特有机制给出适配思路有助于读者快速搭建可运行的集成示例并规避常见问题。全套资源以RAR压缩包形式提供大小约13.54MB便于离线查阅与迁移部署。目前已有4525人学习适合作为企业国产化选型或技术预研的参考资料。 做国产化适配这几年数据库环节最常碰到的组合就是 Flowable 加达梦8。不是达梦不好而是 Flowable 这个工作流引擎对底层数据库的绑定非常深建表语句、分页方言、事务控制每一步都跟数据库方言强耦合。官方支持的清单里没有达梦于是很多团队集成第一天就卡在“建表都跑不起来”这个坎上。这篇文章把我实际集成的方案、踩过的坑和排查思路完整写出来给同样要做 Flowable 适配达梦8的朋友一条能直接走通的路。不管你是刚接触 Flowable 的新手还是已经在生产环境被达梦折腾过的老手这篇文章里的方案应该都能帮你省下几个加班的晚上。1. 为什么Flowable跑到达梦8上会“水土不服”1.1 Flowable的数据库方言机制不是换驱动就能跑Flowable 本质上不是“一套 SQL 走天下”的框架。它把每种数据库的建表脚本、MyBatis 映射、分页方言、锁处理方式都拆分成了独立资源通过一个databaseType参数来区分。官方原生支持的类型大概是 h2、mysql、oracle、postgres、mssql、db2 这几个每个类型都对应一套*.create.*.sql建表脚本和一套 Java 方言类。如果直接把databaseType设成一个 Flowable 不认识的值比如dm初始化阶段就会直接报could not find an appropriate sql file for databaseType dm建表无从谈起。这就是很多人卡住的第一个点不是驱动连不上数据库而是 Flowable 根本不认识达梦这个“数据库类型”。我用一个生活化的类比来帮新手理解。Flowable 就像一家有标准菜谱的连锁餐厅每种数据库是一套厨房设备。MySQL 是电磁炉Oracle 是明火灶都按各自方式写好了菜谱。达梦是一个看起来很像明火灶的国产厨房设备功能大体兼容但点火方式、火力档位和原版不完全一样。你直接把 Oracle 菜谱拿过来大部分菜能做但偶尔会翻车。1.2 达梦8的兼容模式决定你的适配成本达梦8 本身提供了一个关键参数COMPATIBLE_MODE可以切换兼容 Oracle 或兼容 MySQL 等模式。这个参数在数据库初始化时确定直接影响适配路线的选择。我建议在做任何集成之前先查一下达梦当前的兼容模式SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME COMPATIBLE_MODE;COMPATIBLE_MODE的常见取值中0 代表 Oracle 兼容模式1 代表 MySQL 兼容模式。国内绝大多数达梦8 初始化时使用的都是 Oracle 兼容模式因为存量系统、开发习惯、SQL 迁移成本都更偏向 Oracle。这一点的价值在于如果达梦处于 Oracle 兼容模式Flowable 适配可以“借用”官方 Oracle 方言和建表脚本改动量会小很多。如果环境偏偏是 MySQL 兼容模式那就需要走另一条自定义路线后面我也会给方案。所以先确认兼容模式再决定适配策略这是整个项目的地基。2. 集成前的环境准备驱动、依赖与初始化参数2.1 达梦8 JDBC驱动的获取与安装达梦8 的 JDBC 驱动不会出现在 Maven 中央仓库需要从达梦安装目录拿。典型路径是/dmdbms/drivers/jdbc/DmJdbcDriver18.jar如果应用服务器上没有安装达梦客户端就从其他装了达梦的机器上把这个 jar 拷贝出来。建议把它安装到本地 Maven 仓库方便构建时统一管理mvn install:install-file -DfileDmJdbcDriver18.jar \ -DgroupIdcom.dameng \ -DartifactIdDmJdbcDriver18 \ -Dversion8.1.3.62 \ -Dpackagingjar我不推荐用systemPath方式引入本地 jar因为打包发版时容易漏换环境就找不到依赖。老老实实装进本地仓库或私服是最稳妥的。驱动类名注意用新版写法dm.jdbc.driver.DmDriver老资料里写的dm.jdbc.driver.DmJdbcDriver在某些旧驱动里才生效新版驱动两个类都存在但建议统一用前者。2.2 pom依赖与application.yml配置Flowable 版本我选用社区常用的 6.7.2搭配 Spring Boot 2.7.x。依赖方面核心就一个dependency groupIdorg.flowable/groupId artifactIdflowable-spring-boot-starter/artifactId version6.7.2/version /dependency配置文件是关键。下面是能够跑通的最小配置spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://192.168.1.100:5236?schemaFLOWTEST username: FLOWTEST password: Flow123 flowable: database-type: oracle database-schema-update: true async-executor-activate: false check-process-definitions: false这里有几个参数要解释清楚。flowable.database-type如果没配Flowable 会尝试从DataSource连接元数据自动推断。面对达梦时会识别不准甚至报错所以必须手动指定。既然达梦8 是 Oracle 兼容模式这里直接填oracle让 Flowable 加载 Oracle 方言和建表脚本。database-schema-update: true表示启动时自动建表或升级表结构首次集成时务必开启等表建好、流程稳定后可以改成false或者去掉避免每次启动都检查。async-executor-activate: false表示关闭异步执行器。如果暂时用不到定时器任务、异步消息先关掉可以减少启动噪音。等真要用了再单独打开。check-process-definitions: false表示启动时不自动扫描部署流程定义这个看项目习惯。如果打算用代码或 API 方式部署流程保持 false 就好。另外如果yml里的database-type不生效或者你想在代码里统一控制可以注册一个配置类兜底Configuration public class FlowableDamengConfig { Bean public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer() { return config - { config.setDatabaseType(oracle); config.setDatabaseSchemaUpdate(true); }; } }2.3 确认达梦兼容模式与账号权限前面说过要确认COMPATIBLE_MODE。如果是 0继续往下走。如果不是你需要评估是否由 DBA 协助重建实例为 Oracle 兼容模式。在生产环境重建达梦实例涉及数据迁移成本较高所以很多 MySQL 兼容模式的场景下团队会选择给达梦做自定义适配这个我在下一节展开。账号权限方面给 Flowable 用的数据库账号最好单独创建不要直接用 SYSDBA 跑业务。创建用户后默认会有一个同名 schema例如用户 FLOWTESTschema 就是 FLOWTEST。需要给这个用户授予建表、序列、索引等基础权限。达梦的权限模型跟 Oracle 类似RESOURCE角色足够日常建表使用如果发现建表时权限不足再让 DBA 按实际报错授权。连接 URL 里?schemaFLOWTEST的写法在部分驱动版本中有效作用是设置默认 schema。如果这个参数不生效也可以通过 JDBC 的conn.setSchema(FLOWTEST)来切但 Spring Boot 数据源配置层面一般用 URL 参数就够了。3. 核心适配流程建表、初始化与首次流程验证3.1 最省事的方案让Flowable使用Oracle方言建表当达梦处于 Oracle 兼容模式时最实用的做法就是让 Flowable 把自己当成 Oracle 来跑。这一步理论上不需要任何代码改动只需要把database-type配成oracle然后启动应用。Flowable 初始化时会按 Oracle 类型加载对应的建表脚本。以 6.7.2 为例会依次创建ACT_GE_PROPERTY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF、ACT_RU_EXECUTION、ACT_RU_TASK、ACT_HI_PROCINST、ACT_HI_TASKINST等一批表总数大约在 30 多张。启动日志里如果能看到类似“Creating schema”并最终启动成功说明建表阶段没问题。建表完成后执行两条 SQL 看一下数据SELECT * FROM FLOWTEST.ACT_GE_PROPERTY; SELECT COUNT(*) FROM FLOWTEST.ACT_RE_PROCDEF;第一条表里通常有schema.version、schema.history等属性能看到 Flowable 当前的 schema 版本号。第二条查询结果为 0 是正常的因为还没部署流程。我用这个方案在多个环境实测过Flowable 6.7.2 的 Oracle 建表脚本在达梦8 上整体兼容度比较高基础表、索引、主键都能正确创建。需要注意的是一些字段长度和类型上的细节留到后面问题排查部分细讲。3.2 需要自定义时制作dm数据库类型的建表脚本如果你所在的团队对“在配置里写死 oracle 类型”这件事有顾虑或者达梦实例确实是 MySQL 兼容模式那就需要走自定义dm类型的路线。具体做法分三步。第一步从 Flowable 相关 jar 包里把 Oracle 类型的建表脚本提取出来。在本地 Maven 仓库的 flowable-engine、flowable-history-service、flowable-identitylink-service 等模块里可以找到org/flowable/db/create/目录下的flowable.*.create.oracle.sql和flowable.*.drop.oracle.sql。第二步把这些文件复制到你工程的src/main/resources/org/flowable/db/create/目录下统一把文件名里的oracle改成dm例如flowable.all.create.dm.sql。第三步把database-type改成dm启动应用。如果脚本里个别语法达梦不认报错后按错误逐条调整即可。常见需要改的点有超长 VARCHAR 字段比如VARCHAR(4000)在达梦8 的 8K 页大小环境下可能报“记录超长”需要手动改成 CLOB 或 TEXT 类型。某些 Oracle 专属写法在达梦里不识别比如CREATE INDEX ... INDEXTYPE IS之类的去掉或改成达梦支持的语法。如果是从 MySQL 建表脚本改造ENGINEInnoDB、COMMENTxxx这类语法也必须清理。这条路线的优点是彻底Flowable 运行时对外的databaseType是dm心理上更符合预期也方便后续团队基于同一套 dm 脚本去迭代。缺点是需要维护一套自定义 SQL 脚本Flowable 升级时要重新比对版本差异。3.3 建表成功后的第一轮流程验证光把表建出来不算集成完成必须跑通至少一个完整流程。我建议用最简单的单节点审批流程来验证Autowired private RepositoryService repositoryService; Autowired private RuntimeService runtimeService; Autowired private TaskService taskService; public void testSimpleProcess() { // 1. 部署流程 repositoryService.createDeployment() .addClasspathResource(processes/leave.bpmn20.xml) .name(请假流程) .deploy(); // 2. 启动流程实例 ProcessInstance instance runtimeService.startProcessInstanceByKey(leave); // 3. 查询并完成第一个任务 Task task taskService.createTaskQuery() .processInstanceId(instance.getId()) .singleResult(); taskService.complete(task.getId()); }只要这三步能跑通说明部署、流程实例创建、任务查询、任务完成这几条核心链路在达梦8 上都没有问题。接着再测一测驳回、多实例会签、子流程、定时器这些高级特性不过那些属于业务层面回归不是集成阶段的必测项。4. 运行期高频问题与排查技巧4.1 建表阶段的报错与处理建表阶段最常见的报错就是开头的could not find an appropriate sql file for databaseType dm。这个很好解决要么把database-type改回oracle要么按上一节的方法把 dm 建表脚本补齐。第二个高频问题是“记录超长”。达梦8 的页大小默认是 8KVARCHAR类型最大长度受此限制。Flowable 的 Oracle 建表脚本里有少量字段定义成了VARCHAR(4000)在达梦上可能出现超长。解决方式两种一是把对应字段类型改成 CLOB 或 TEXT二是由 DBA 在初始化数据库时配置更大的页大小16K 或 32K。注意页大小在建库时确定后期改很麻烦所以如果你有得选建议达梦建库时直接上 16K能少踩很多坑。第三个高频问题跟 SQL 脚本里的中文注释、特殊符号有关。如果使用达梦自带管理工具或disql执行脚本时遇到符号被解析为变量可以执行SET DEFINE OFF关闭变量替换或者用专业的数据库客户端工具执行。4.2 流程运行阶段的分页、锁与数据问题流程跑到一定规模后分页问题就来了。Flowable 在 Oracle 方言下使用的是ROWNUM分页逻辑达梦8 在 Oracle 兼容模式下基本能识别这种写法但个别复杂查询尤其是带ORDER BY和子查询的在达梦上的执行计划可能与 Oracle 有差异表现是分页结果顺序偶尔不对。遇到这种问题建议不要为了“原生兼容”死磕直接在达梦端查看慢 SQL给相关表补索引。Flowable 的运行时表ACT_RU_*核心查询条件都有标准列比如PROC_INST_ID_、TASK_DEF_KEY_、EXECUTION_ID_等达梦管理工具里找到对应表把高频查询涉及的列补上索引实际效果比纠结分页 SQL 更重要。锁的问题也值得留意。Flowable 运行时会用到SELECT ... FOR UPDATE在并发执行任务时会锁行。达梦的行锁行为跟 Oracle 大体类似但锁等待超时参数的默认值可能更短高并发下容易出现锁等待超时或死锁。处理思路通常是缩短事务时间、调整流程并发度、必要时由 DBA 调整达梦的锁等待参数。还有一类问题是BLOB大字段的读取。Flowable 把流程定义源文件、附件等内容存成BLOB达梦在事务中频繁读写大字段时如果没有及时关闭流或提交事务可能出现游标不足或内存占用偏高。这一点排查起来隐蔽我建议在启动参数里加上连接回收配置并确保应用中有关闭InputStream的习惯。4.3 问题速查表与日常巡检建议我把集成和运行期的高频问题整理成一张速查表方便遇到问题时直接对照问题现象可能原因解决方法启动报could not find an appropriate sql fileFlowable 不识别dm类型使用 oracle 类型或提供 dm 建表脚本建表报“记录超长”页大小限制导致 VARCHAR(4000) 超长改为 CLOB/TEXT或建库时配置 16K 页建表报语法错误使用了另一套数据库的 SQL 脚本统一使用 Oracle 类型的脚本并清理非兼容语法分页顺序不对ROWNUM 与 ORDER BY 执行计划差异补索引、慢 SQL 优化、改用 limit 方言并发下锁等待超时达梦锁等待参数偏短缩短事务、降低并发、调整锁等待参数BLOB 读取异常大字段事务处理不当及时关闭流、合并短事务批量插入慢JDBC 批量提交配置不合理关闭自动提交合理批次大小日常巡检方面我习惯定期看两张表ACT_HI_PROCINST和ACT_HI_TASKINST。这两张表记录所有历史流程实例和任务增长最快。如果项目里有大量定时器任务或历史流程建议在业务低峰期做归档清理或者把history-level调整到audit甚至更低减少历史数据量。5. 实测感受与个人建议集成做完之后我对 Flowable 6.7.2 与达梦8 的搭配整体是满意的。最核心的流程部署、发起、审批、驳回、历史查询这些主链路在达梦8 上表现稳定没有出现需要改框架代码的情况。真正花时间的反而是前期对数据库类型的理解、建表脚本的兼容性排查以及上线前对锁和索引的调优。我个人的经验是如果项目启动时间紧走“Oracle 方言”这条兼容路线是最快的。等系统跑稳了、团队对达梦的特性熟悉了再根据实际需要决定要不要维护一套 dm 专用脚本。不要一上来就追求“必须是 dm 类型”解决问题的质量和效率比名字看起来的完成度更重要。最后再分享一个小技巧。启动完成后把database-schema-update从 true 改成 false同时把达梦上的建表脚本导出留存到 Git 里。这样后续环境部署、版本升级都可以用 SQL 脚本直接初始化数据库应用启动时只校验版本号不依赖自动建表线上环境更可控也给自己和团队少留一些“启动即升级”的意外。本文还有配套的精品资源点击获取
返回列表