Activiti7数据库表结构详解:从25张表看懂工作流引擎如何运转
2026/6/25 21:56:55 网站建设 项目流程

Activiti7数据库表结构深度解析:工作流引擎的数据运转密码

当我们在企业级应用中实施业务流程管理时,工作流引擎就像一位无形的指挥家,而数据库表则是它记录每个音符的乐谱。Activiti7作为当前主流的工作流引擎,其精妙之处往往隐藏在自动生成的25张数据库表中。本文将带您以"数据侦探"的视角,解剖这些表的设计哲学和协作机制,揭示工作流引擎背后的数据流动奥秘。

1. 工作流数据的三重时空维度

Activiti7的数据库表设计遵循清晰的分类逻辑,所有表名都带有前缀标识其核心职责。理解这三类表的划分,是掌握工作流数据管理的关键。

1.1 静态资源库(act_re_*)

这类表如同工作流的"设计图纸仓库",存储流程定义的基础元素:

  • act_re_deployment:每次流程部署的快照记录
  • act_re_procdef:解析后的流程定义详情
  • act_re_model:流程设计器的模型数据
  • act_re_bytearray:存储BPMN文件和流程图PNG的二进制数据

提示:act_re_deploymentact_re_procdef是一对多关系,一次部署可包含多个流程定义

1.2 运行时数据(act_ru_*)

引擎运行时的"工作记忆区",特点是数据随流程实例结束而消失:

表名关键字段生命周期
act_ru_executionPROC_INST_ID_, BUSINESS_KEY_流程实例存活期间
act_ru_taskASSIGNEE_, CREATE_TIME_任务未完成时
act_ru_variableTYPE_, NAME_, VALUE_变量被引用期间
act_ru_identitylinkGROUP_ID_, USER_ID_身份关联存在时

1.3 历史档案(act_hi_*)

工作流的"黑匣子记录",即使流程结束仍保留轨迹:

-- 典型历史查询示例 SELECT * FROM act_hi_procinst WHERE START_USER_ID_ = 'user1' ORDER BY START_TIME_ DESC LIMIT 5;

历史表的核心价值在于:

  • 流程执行时长分析(DURATION_字段)
  • 审批路径追溯(act_hi_actinst
  • 效率统计(act_hi_taskinst

2. 从请假流程看数据生命周期

让我们通过一个请假审批流程,观察数据如何在表间流转。假设流程包含:提交申请→部门审批→HR备案→结束。

2.1 流程部署阶段

当部署请假流程时,数据库变化如下:

  1. act_re_deployment新增记录:
    { "ID_": "25001", "NAME_": "请假流程v1.2", "DEPLOY_TIME_": "2023-07-20 15:00:00" }
  2. act_re_procdef添加流程定义:
    // 对应的Java实体属性 processDefinition.setKey("leaveProcess"); processDefinition.setVersion(3); processDefinition.setResourceName("leave.bpmn20.xml");
  3. act_re_bytearray存储两个文件:
    • leave.bpmn20.xml(BPMN标准文件)
    • leave.leaveProcess.png(流程图图像)

2.2 流程启动时刻

员工发起请假时,运行时表开始活跃:

  • act_ru_execution生成流程实例记录
  • act_ru_task创建首个任务节点
  • act_hi_procinst记录流程实例开始
  • act_hi_taskinst初始化任务历史

注意:act_ru_taskASSIGNEE_字段会设置为BPMN中定义的办理人

2.3 审批环节流转

当部门经理审批时,关键数据变化包括:

  1. act_ru_task更新:
    • 原任务状态变为COMPLETED
    • 新任务记录生成(审批节点)
  2. act_hi_actinst新增两条记录:
    • 申请节点完成
    • 审批节点开始
  3. act_ru_variable可能存储:
    • 请假类型(年假/病假)
    • 请假天数
    • 审批意见

2.4 流程结束时刻

当流程到达结束节点:

  1. act_ru_* 所有相关记录被清除
  2. act_hi_procinst更新:
    • END_TIME_设置为完成时间
    • DURATION_计算总耗时
  3. act_hi_varinst持久化所有流程变量

3. 高级数据操作实战

3.1 自定义历史级别配置

通过activiti.cfg.xml控制历史数据粒度:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- 历史级别配置 --> <property name="history" value="audit" /> <!-- 可选值: none - 不保存历史 activity - 仅保存节点实例 audit - 节点+变量(默认) full - 完整历史(含细节) --> </bean>

3.2 复杂查询示例

跨表关联查询(审批效率分析):

SELECT t.NAME_ AS task_name, AVG(TIMESTAMPDIFF(MINUTE, t.START_TIME_, t.END_TIME_)) AS avg_duration FROM act_hi_taskinst t JOIN act_hi_procinst p ON t.PROC_INST_ID_ = p.ID_ WHERE p.PROC_DEF_ID_ = 'leaveProcess:1:25003' AND t.END_TIME_ IS NOT NULL GROUP BY t.NAME_;

Java API查询历史(按业务键检索):

HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery() .processInstanceBusinessKey("LEAVE-2023-001") .includeProcessVariables() .orderByProcessInstanceStartTime().desc(); List<HistoricProcessInstance> instances = query.list();

3.3 性能优化建议

  1. 历史数据归档

    • 定期将act_hi_*表数据迁移到归档库
    • 使用ACT_RU_EVENT_SUBSCR实现事件驱动归档
  2. 运行时表索引优化

    ALTER TABLE act_ru_task ADD INDEX idx_assignee (ASSIGNEE_); ALTER TABLE act_ru_execution ADD INDEX idx_proc_inst (PROC_INST_ID_);
  3. 变量存储策略

    • 大文本变量使用TEXT类型而非VARCHAR
    • 频繁访问的变量考虑缓存到Redis

4. 异常场景数据追踪

当流程出现异常时,这些表是排查的关键:

4.1 死锁检测

检查act_ru_job表:

SELECT * FROM act_ru_job WHERE LOCK_OWNER_ IS NOT NULL AND LOCK_EXP_TIME_ < NOW();

4.2 任务卡顿分析

// 查询超过24小时未完成的任务 List<Task> staleTasks = taskService.createTaskQuery() .taskCreatedBefore(DateUtils.addDays(new Date(), -1)) .list(); // 对应的历史SQL SELECT * FROM act_hi_taskinst WHERE END_TIME_ IS NULL AND DATEDIFF(NOW(), START_TIME_) > 1;

4.3 变量类型冲突

常见于act_ru_variable表类型不匹配:

// 安全获取变量值示例 Object variable = runtimeService.getVariable( executionId, "approvalStatus"); if (variable instanceof Boolean) { // 处理布尔类型 } else if (variable instanceof String) { // 处理字符串类型 }

掌握Activiti7的表结构设计原理,就像获得了工作流引擎的调试器。当我们需要实现流程监控看板、异常自动修复或动态流程调整时,这些知识将成为最有力的工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询