Activiti 7数据库表结构全解析:从act_re到act_ru,看完这篇就懂了

📅 2026/8/2 5:51:45 👁️ 阅读次数 📝 编程学习
Activiti 7数据库表结构全解析:从act_re到act_ru,看完这篇就懂了

Activiti 7数据库表结构全解析:从act_re到act_ru的深度实践指南

第一次接触Activiti 7的开发者往往会被它自动生成的数十张数据库表搞得晕头转向。这些表名看似有规律却又难以捉摸,字段含义晦涩难懂。本文将带你穿透迷雾,从数据库视角彻底掌握Activiti 7的工作流运行机制。

1. Activiti表结构设计哲学

Activiti的表命名遵循一套严谨的语义化规则,每个前缀都暗藏玄机。理解这套命名体系,相当于拿到了破解工作流引擎的密钥。

核心表分类逻辑

  • act_re_*:资源库(Repository)表,存储静态流程定义
  • act_ru_*:运行时(Runtime)表,记录运行中实例的临时数据
  • act_hi_*:历史(History)表,归档已完成流程的轨迹
  • act_id_*:身份(Identity)表,管理用户与权限体系
  • act_ge_*:通用(General)表,存放二进制资源等

提示:开发环境建议开启databaseSchemaUpdate自动建表,但生产环境务必使用SQL脚本初始化

下表展示了主要表类型的生命周期差异:

表类型数据产生时机数据销毁时机典型用途
RE表流程部署时主动删除部署版本控制
RU表启动实例时流程结束时运行时监控
HI表节点流转时永久保存审计分析

2. 资源库表(act_re_)深度剖析

资源库表是流程定义的"基因库",部署流程时产生的DNA信息全存储于此。以请假流程为例,部署后重点关注三张核心表:

act_re_deployment:部署主表

SELECT * FROM act_re_deployment WHERE NAME_='请假流程';
  • ID_:部署唯一标识
  • DEPLOY_TIME_:部署时间戳
  • CATEGORY_:分类标签

act_re_procdef:流程定义表

ProcessDefinitionQuery query = repositoryService .createProcessDefinitionQuery() .deploymentId(deploymentId);

关键字段:

  • KEY_:流程定义键(bpmn文件中的id)
  • VERSION_:版本号(自动递增)
  • RESOURCE_NAME_:bpmn文件路径
  • DGRM_RESOURCE_NAME_:流程图路径

act_ge_bytearray:二进制资源表 存储流程定义的"双胞胎"文件:

  1. .bpmn20.xml:流程模型文件
  2. .png:流程可视化图示

3. 运行时表(act_ru_)实时追踪

运行时表就像流程的"心电图",实时反映工作流状态。启动请假流程实例后,这些表开始活跃:

act_ru_execution:执行实例表

-- 查询运行中的流程实例 SELECT * FROM act_ru_execution WHERE PROC_INST_ID_='流程实例ID';

字段解析:

  • BUSINESS_KEY_:业务系统关联键
  • ACT_ID_:当前活动节点ID
  • IS_ACTIVE_:是否活跃状态

act_ru_task:任务实例表

// 查询待办任务 List<Task> tasks = taskService.createTaskQuery() .taskAssignee("张三") .list();

关键操作:

# 伪代码展示任务生命周期 taskService.claim(taskId, userId) # 签收任务 taskService.complete(taskId) # 完成任务 taskService.setVariable(taskId, "days", 3) # 设置变量

act_ru_variable:流程变量表 存储流程中的动态参数,支持多种类型:

  • 基本类型:string、integer、boolean等
  • 序列化对象:Serializable
  • 日期类型:Date、Timestamp

4. 历史表(act_hi_)审计分析

历史表是流程的"黑匣子",即使流程结束仍可追溯完整轨迹。重点关注三张表:

act_hi_procinst:流程实例历史

-- 查询已完成流程的平均耗时 SELECT AVG(DURATION_) FROM act_hi_procinst WHERE END_TIME_ IS NOT NULL;

act_hi_taskinst:任务实例历史 典型分析场景:

  1. 任务处理时效分析
  2. 审批人工作负载统计
  3. 流程瓶颈节点识别

act_hi_varinst:变量变更历史

HistoricVariableInstanceQuery query = historyService .createHistoricVariableInstanceQuery() .processInstanceId(procInstId);

5. 实战:请假流程数据流转全追踪

让我们用具体案例串联各表数据变化:

阶段一:流程部署

  1. act_re_deployment插入部署记录
  2. act_ge_bytearray存储流程图文件
  3. act_re_procdef生成流程定义

阶段二:启动实例

# 启动流程实例 processInstance = runtimeService.startProcessInstanceByKey( "leaveProcess", businessKey="2023001" );

数据影响:

  • act_ru_execution生成主执行记录
  • act_ru_task创建首个任务
  • act_hi_procinst记录实例开始
  • act_hi_taskinst初始化任务

阶段三:审批流转当张三提交请假申请后:

  1. act_ru_task更新为李四的审批任务
  2. act_hi_actinst记录"提交申请"节点完成
  3. act_hi_varinst可能更新请假天数等变量

阶段四:流程结束

  • act_ru_*表数据自动清除
  • act_hi_procinst更新结束时间
  • act_hi_taskinst记录审批完成

6. 高级查询与性能优化

面对复杂的业务流程,需要掌握高效查询技巧:

跨表关联查询

-- 查询审批超时的任务 SELECT t.* FROM act_hi_taskinst t JOIN act_hi_procinst p ON t.PROC_INST_ID_ = p.ID_ WHERE t.END_TIME_ IS NULL AND p.END_TIME_ IS NULL AND DATEDIFF(NOW(), t.CREATE_TIME_) > 3;

历史数据归档策略

  1. 定期清理:配置HistoryService的清理策略
  2. 分表存储:按业务日期水平分表
  3. ES同步:将历史数据同步到Elasticsearch
// 历史数据清理配置 managementService.executeCommand(new CustomHistoryCleanupCmd());

索引优化建议

-- 为高频查询字段添加索引 CREATE INDEX idx_act_hi_task_assignee ON act_hi_taskinst(ASSIGNEE_); CREATE INDEX idx_act_ru_task_procinst ON act_ru_task(PROC_INST_ID_);

7. 常见问题排查指南

问题一:流程卡死排查步骤:

  1. 检查act_ru_task是否存在待办任务
  2. 查询act_ru_execution确认当前节点
  3. 查看act_ru_event_subscr事件订阅

问题二:变量丢失解决方案:

  1. 检查变量作用域(流程级/任务级)
  2. 验证变量类型是否支持序列化
  3. 排查act_ge_bytearray中的异常数据

问题三:性能瓶颈优化方向:

  1. 监控act_ru_job表中的异步作业
  2. 调整asyncExecutor线程池配置
  3. 优化流程设计,减少并行分支
// 获取引擎健康状态 Map<String, String> props = managementService.getProperties(); String jobExecutorStatus = props.get("jobExecutorActivate");

理解Activiti的数据库设计后,曾经的黑盒操作现在变得透明可见。建议在日常开发中多结合数据库状态分析问题,这种"数据库视角"的调试方法往往能快速定位问题根源。