由于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只支