Activiti工作流引擎Mysql迁移到TiDB

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

由于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只支
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值