Activiti7数据库表结构全解析从25张表看懂工作流引擎的运行逻辑第一次接触Activiti7时最让我困惑的不是BPMN流程图设计而是启动项目后自动生成的那25张数据库表。这些以act_开头的表究竟存储了什么为什么有的表在流程结束后数据会消失本文将用真实的请假流程案例带您穿透代码层直达数据库理解工作流引擎的底层运行机制。1. 核心表分类与设计哲学Activiti7的表结构设计遵循运行时效率与历史追溯分离的原则。所有表名采用前缀功能的分段命名方式-- 表名通用模式 act_[前缀]_[功能描述]1.1 三大核心表群前缀全称数据生命周期典型表举例RERepository永久存储ACT_RE_DEPLOYMENTRURuntime流程实例存活期间ACT_RU_TASKHIHistory永久存储ACT_HI_PROCINSTRE表群就像流程定义的保险柜存储着部署的BPMN文件二进制内容ACT_GE_BYTEARRAY流程定义元数据ACT_RE_PROCDEFRU表群则是工作流的运行时内存包含正在执行的任务ACT_RU_TASK流程变量ACT_RU_VARIABLE当前执行路径ACT_RU_EXECUTIONHI表群如同黑匣子记录仪忠实记录已完成的流程实例ACT_HI_PROCINST所有活动节点历史ACT_HI_ACTINST任务处理人变更ACT_HI_IDENTITYLINK提示RU表的数据会在流程实例结束后自动清除这是设计上的性能优化避免运行表无限膨胀。2. 流程部署的数据库足迹当执行repositoryService.createDeployment()时数据库会发生这些变化// 典型部署代码示例 Deployment deployment repositoryService.createDeployment() .addClasspathResource(leave-request.bpmn20.xml) .name(请假流程V2) .deploy();2.1 ACT_RE_DEPLOYMENT表ID_NAME_DEPLOY_TIME_2501请假流程V22023-08-20 14:30:22这个表记录每次部署的元信息其主键会关联到多个其他表。2.2 ACT_GE_BYTEARRAY表ID_DEPLOYMENT_ID_NAME_BYTES_50012501leave-request.bpmn[BLOB数据]50022501leave-request.png[BLOB数据]存储的是流程定义的原始文件包括BPMN 2.0 XML文件流程图形化渲染图片2.3 ACT_RE_PROCDEF表ID_KEY_VERSION_DEPLOYMENT_ID_RESOURCE_NAME_leave:1:2501leave12501leave-request.bpmn关键字段解析ID_KEY_:VERSION_:DEPLOYMENT_ID_KEY_对应BPMN文件中的process id属性VERSION_自动递增相同KEY的流程会版本升级3. 流程实例运行时的数据流动以请假流程为例当员工发起申请时ProcessInstance instance runtimeService .startProcessInstanceByKey(leave);3.1 ACT_RU_EXECUTION表变化ID_PROC_INST_ID_PROC_DEF_ID_ACT_ID_IS_ACTIVE_30013001leave:1:2501start030023001leave:1:2501apply1这个表保存流程的执行上下文重要字段PROC_INST_ID_流程实例唯一标识ACT_ID_当前所处的BPMN节点IDIS_ACTIVE_0表示已完成的执行分支3.2 ACT_RU_TASK表生成ID_PROC_INST_ID_NAME_TASK_DEF_KEY_ASSIGNEE_40013001提交请假单applyzhangsan此时前端展示给用户的任务列表就是查询此表SELECT * FROM ACT_RU_TASK WHERE ASSIGNEE_ zhangsan3.3 历史表的初始记录ACT_HI_PROCINST表会立即生成记录ID_PROC_DEF_ID_START_TIME_START_USER_ID_3001leave:1:25012023-08-20 15:00:00zhangsan4. 任务处理引发的连锁反应当张三完成任务时taskService.complete(taskId);4.1 运行时数据迁移ACT_RU_TASK表删除张三的当前任务记录插入李四的新审批任务记录ACT_RU_VARIABLE表如果有流程变量ID_TYPE_NAME_EXECUTION_ID_TEXT_VALUE_6001stringreason3002年假申请4.2 历史表的双重记录ACT_HI_TASKINST表记录任务详情ID_PROC_DEF_ID_TASK_DEF_KEY_START_TIME_END_TIME_4001leave:1:2501apply2023-08-20 15:00:002023-08-20 15:05:00ACT_HI_ACTINST表记录所有活动节点ID_PROC_DEF_ID_ACT_ID_ACT_TYPE_START_TIME_END_TIME_7001leave:1:2501startstartEvent2023-08-20 15:00:002023-08-20 15:00:027002leave:1:2501applyuserTask2023-08-20 15:00:022023-08-20 15:05:005. 高级应用与性能优化5.1 历史级别配置在activiti.cfg.xml中可以调整历史记录粒度bean idprocessEngineConfiguration classorg.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration property namehistory valueaudit / /bean可选值none不记录历史activity仅记录节点默认audit记录节点与变量full完整记录含表单提交细节5.2 常见查询优化方案场景1快速查找用户的待办任务-- 低效写法 SELECT * FROM ACT_RU_TASK WHERE ASSIGNEE_ zhangsan; -- 优化方案添加组合索引 CREATE INDEX idx_ru_task_assignee ON ACT_RU_TASK(ASSIGNEE_);场景2统计流程平均耗时-- 使用历史视图 SELECT AVG(DATEDIFF(END_TIME_, START_TIME_)) FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL;5.3 自定义表前缀对于多租户系统可以修改表名前缀ProcessEngineConfiguration config new StandaloneProcessEngineConfiguration() .setDatabaseSchemaUpdate(true) .setDatabaseTablePrefix(CUST_);6. 实战诊断数据不一致问题曾遇到一个生产环境问题流程实例显示已完成但任务列表仍有残留任务。通过以下步骤排查检查运行时表SELECT * FROM ACT_RU_EXECUTION WHERE PROC_INST_ID_ 3001;发现存在IS_ACTIVE_1的异常记录对比历史表SELECT * FROM ACT_HI_PROCINST WHERE ID_ 3001;显示流程已结束解决方案runtimeService.deleteProcessInstance(3001, 数据修复);这种数据不一致通常是由于系统异常终止导致的关键是要建立RU表与HI表的交叉验证机制。