Activiti工作流引擎Mysql迁移到TiDB

在将Activiti工作流引擎从MySQL迁移至TiDB时,遇到由于两者参数lower_case_table_name差异导致的问题。TiDB不支持修改此参数,使得Activiti在检查数据表存在性时无法正确识别,进而尝试错误地创建已存在的表,引发启动失败。为解决这个问题,可以在项目启动前使用Javassist字节码框架动态修改DbSqlSession的字节码,将表名转换为小写,以兼容MySQL和TiDB的大小写规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于Mysql和TiDB 参数lower_case_table_name 默认值有差异 且TiDB(2020年5月28发布的4.0.0最新版)不可修改导致
在TiDB中执行 SHOW FULL TABLES FROM oa_ bpm LIKE ${tableName} 语句 tableName 只能匹配到小写表名。
OA流程引擎启动时 会执行SHOW FULL TABLES FROM 语句判断内置的数据表是否存在(ACT_RU_EXECUTION,ACT_HI_PROCINST,ACT_ID_USER)。

根据目前的activiti engine配置属性 ,如果指定表已经存在 会更新则会更新其数据,不存在指定数据表时 ,则重新创建对应的表结构 。
由于OA流程引擎其基于开源项目Activiti工作流引擎(5.22.0),其源码 org.activiti.engine.impl.db.DbSqlSession中固定写死大写的表名,

因此即使指定的表已存在,Activiti工作流引擎使用TiDB数据源时,相关方法(isEngineTablePresent,isHistoryTablePresent,isIdentityTablePresent)依旧返回false
因此错误的执行了建表语句 但是又由于TiDB中 CREATE TABLE 语句并不区分表名大小写,导致建表失败(Table ‘oa_bpm.{tableName}’ already exists)
最终导致引用了activiti模块的 bpm-model,bpm-runtime模块启动失败

在项目引用了的activiti模块中修改配置
在项目启动时 Activiti工作流引擎初始之前使用Javassist字节码框架
动态修改org.activiti.engine.impl.db.DbSqlSession的字节码
将其3个方法isEngineTablePresent,isHistoryTablePresent,isIdentityTablePresent 中大写表名重新定义为小写(小写兼容Mysql和TiDB)

	
	/**
	 * Hook3个activiti探测表的方法 解决activiti engine启动时 在TiDB执行 SHOW FULL TABLES FROM `oa_bpm` LIKE 'tableName'
	 * tableName只支持小写才能匹配到的问题 
	 * 一定要在SpringProcessEngineConfiguration 初始化之前执行字节码修改
	 */

	public 
### Activiti与其他工作流引擎的区别 Activiti、Camunda和Flowable均属于开源的工作流引擎,在功能上具有诸多共通之处,但在某些特性上有显著的不同。 #### 功能对比 - **社区支持与活跃度** Camunda拥有非常活跃的社区和支持团队,提供了丰富的文档和技术书籍[^3]。相比之下,虽然Activiti也有一定的社区基础,但近年来发展速度有所放缓。 - **架构设计** Flowable的设计理念继承自Activiti,两者在很多地方保持一致,这使得熟悉其中一个平台的学习者能够快速掌握另一个平台的操作方法。然而,Camunda采用了不同的架构方式,特别是在处理复杂业务逻辑时表现更为出色。 - **性能优化** 在大规模并发场景下,Camunda通过一系列技术手段实现了更好的吞吐量和响应时间;而Activiti则可能需要更多的调优才能达到相近的效果[^1]。 - **易用性和灵活性** 对于开发者而言,Flowable因其简洁直观的API接口受到欢迎,易于集成到现有应用环境中去。Activiti同样具备良好的可扩展性,但由于历史遗留原因部分API显得不够现代化。 - **数据库兼容性** 当涉及到特定数据库迁移操作时(如从MySQL迁移TiDB),Activiti可能会遇到一些挑战,比如硬编码的大写表名问题[^4]。这类情况在其他两个平台上通常能得到更好地解决。 ### 不同版本Activiti之间的差异 随着时间推移,Activiti经历了多个重要版本迭代: - **早期版本 (v5.x系列)** 这些版本奠定了Activiti的核心框架结构,引入了BPMN 2.0标准的支持,并逐步完善了事务管理和持久化机制等功能模块。 - **中期版本 (v6.x系列)** 主要改进集中在性能提升方面,例如优化查询效率、减少内存占用等措施。同时增加了更多企业级特性的支持,像多租户模式、安全认证授权体系等等。 - **最新版本 (7.x及以上)** 开始向云原生方向转型,加强了微服务架构下的适用能力,提供更加灵活的任务调度策略和服务编排选项。不过需要注意的是,新旧版之间可能存在不完全向下兼容的情况,升级过程中需谨慎评估影响范围并做好充分测试准备。 ```java // 示例代码展示如何初始化不同版本的Activiti Engine配置 Configuration configV5 = new StandaloneInMemProcessEngineConfiguration(); configV5.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); ProcessEngine processEngineV5 = configV5.buildProcessEngine(); Configuration configV6 = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration() .setHistoryLevel(HistoryLevel.FULL) .buildProcessEngine(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值