Activiti 7.x 数据库表结构深度解析从运行时数据到历史轨迹的完整生命周期1. Activiti 数据表架构全景图Activiti 作为企业级工作流引擎其数据库设计遵循清晰的模块化分类。所有表名均以ACT_前缀开头第二部分双字母标识表的功能范畴graph TD A[ACT_GE_] --|通用数据| B[属性表/资源表] C[ACT_RE_] --|流程存储| D[部署表/定义表] E[ACT_RU_] --|运行时数据| F[实例表/任务表] G[ACT_HI_] --|历史数据| H[流程实例/任务记录] I[ACT_ID_] --|身份数据| J[用户表/组关系表]运行时RU与历史HI表的黄金组合运行时表仅保存活跃流程数据流程结束后自动迁移到历史表。这种设计使得运行时表始终保持轻量历史表则形成完整的审计追踪链。2. 运行时数据表群ACT_RU_*核心解析2.1 流程实例与执行流表ACT_RU_EXECUTION这张表同时承载两种语义流程实例顶层执行流执行流具体路径关键字段对比字段流程实例特征执行流特征PROC_INST_ID_ ID_≠ ID_PARENT_ID_NULL指向父执行流IS_ACTIVE_10/1并行分支-- 典型查询查找所有活跃流程实例 SELECT * FROM ACT_RU_EXECUTION WHERE PARENT_ID_ IS NULL AND SUSPENSION_STATE_ 1;2.2 任务运行时表ACT_RU_TASK任务流转的核心载体关键字段包含TASK_DEF_KEY_对应流程定义中的节点IDASSIGNEE_动态任务分配人DELEGATION_委托状态PENDING/RESOLVED重要提示任务完成时该表记录会被删除并写入历史表。如需跟踪任务状态变化必须配置适当的历史级别。2.3 运行时变量表ACT_RU_VARIABLE支持多种变量类型的存储方案// Java代码示例设置流程变量 runtimeService.setVariable( executionId, invoiceAmount, new Double(10000.00) );变量存储策略基本类型直接存入对应字段DOUBLE_/LONG_序列化对象存入ACT_GE_BYTEARRAY后记录ID大文本使用TEXT_字段4000字符限制3. 历史数据表群ACT_HI_*设计精要3.1 历史流程实例表ACT_HI_PROCINST与运行时表的最大区别在于START_ACT_ID_记录启动节点IDEND_ACT_ID_记录结束节点IDDURATION_计算流程总耗时毫秒-- 计算平均流程处理时长 SELECT AVG(DURATION_)/1000/60 AS avg_minutes FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL;3.2 历史活动表ACT_HI_ACTINSTvs 历史任务表ACT_HI_TASKINST对比维度ACT_HI_ACTINSTACT_HI_TASKINST记录范围所有节点类型仅用户任务数据密度高每个节点一条低仅任务节点关键字段ACT_TYPE_节点类型TASK_DEF_KEY_任务定义ID4. 流程存储表群ACT_RE_*与部署机制4.1 部署三件套ACT_RE_DEPLOYMENT部署单元元数据ACT_GE_BYTEARRAY存储BPMN/PNG文件ACT_RE_PROCDEF解析后的流程定义部署时的数据流转部署文件 → ACT_GE_BYTEARRAY → 解析为 ACT_RE_PROCDEF → 记录部署元数据到 ACT_RE_DEPLOYMENT4.2 流程定义版本控制ACT_RE_PROCDEF表的ID_字段格式{processDefinitionKey}:{version}:{generatedId}版本升级时相同KEY的流程定义会自动递增VERSION_字段旧版本保持可追溯。5. 实战中的表关联查询技巧5.1 查询用户待办任务跨三表SELECT task.*, proc.NAME_ AS proc_name FROM ACT_RU_TASK task JOIN ACT_RU_EXECUTION exec ON task.PROC_INST_ID_ exec.PROC_INST_ID_ JOIN ACT_RE_PROCDEF proc ON task.PROC_DEF_ID_ proc.ID_ WHERE task.ASSIGNEE_ user1 AND exec.SUSPENSION_STATE_ 1;5.2 追踪流程变量历史SELECT var.*, act.ACT_NAME_ FROM ACT_HI_VARINST var JOIN ACT_HI_ACTINST act ON var.EXECUTION_ID_ act.EXECUTION_ID_ WHERE var.PROC_INST_ID_ procInstId ORDER BY var.PROC_INST_ID_, act.ACT_ID_;6. 性能优化关键策略历史级别配置# application.properties activiti.history-levelauditnone不记录历史activity基础记录推荐生产环境full完整记录开发调试运行时数据清理// 自动清理已结束流程的运行时数据 managementService.executeCommand( new HistoryCleanupCmd(true) );索引优化建议为所有PROC_INST_ID_字段添加索引高频查询字段组合索引如ACT_RU_TASK的ASSIGNEE_CREATEDATE_7. 表结构演进与版本差异Activiti 7.x 新增表ACT_RU_DEADLETTER_JOB死信任务ACT_RU_SUSPENDED_JOB暂停任务ACT_PROCDEF_INFO流程定义扩展表典型版本迁移注意点从6.x升级需检查历史数据兼容性7.x默认启用新的作业执行器AsyncExecutor8. 设计启示与最佳实践业务键BUSINESS_KEY_使用规范runtimeService.startProcessInstanceByKey( invoiceApproval, INV-2023-001 // 业务主键 );多租户实现方案通过TENANT_ID_字段实现数据隔离每个租户独立部署流程定义异常处理机制失败作业自动转入ACT_RU_DEADLETTER_JOB通过管理API进行重试或人工处理// 死信任务处理示例 ListDeadLetterJobEntity jobs managementService .createDeadLetterJobQuery() .list(); for (DeadLetterJobEntity job : jobs) { managementService.moveDeadLetterJobToExecutableJob( job.getId(), 3 ); }掌握Activiti表结构设计原理能够帮助开发者更精准地排查流程问题设计高效的查询方案合理规划数据库资源构建可靠的流程监控系统实际项目中建议结合流程可视化工具如Activiti Explorer实时观察数据变化加深对各表协作机制的理解。