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:二进制资源表 存储流程定义的"双胞胎"文件:
.bpmn20.xml:流程模型文件.png:流程可视化图示
3. 运行时表(act_ru_)实时追踪
运行时表就像流程的"心电图",实时反映工作流状态。启动请假流程实例后,这些表开始活跃:
act_ru_execution:执行实例表
-- 查询运行中的流程实例 SELECT * FROM act_ru_execution WHERE PROC_INST_ID_='流程实例ID';字段解析:
BUSINESS_KEY_:业务系统关联键ACT_ID_:当前活动节点IDIS_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:任务实例历史 典型分析场景:
- 任务处理时效分析
- 审批人工作负载统计
- 流程瓶颈节点识别
act_hi_varinst:变量变更历史
HistoricVariableInstanceQuery query = historyService .createHistoricVariableInstanceQuery() .processInstanceId(procInstId);5. 实战:请假流程数据流转全追踪
让我们用具体案例串联各表数据变化:
阶段一:流程部署
act_re_deployment插入部署记录act_ge_bytearray存储流程图文件act_re_procdef生成流程定义
阶段二:启动实例
# 启动流程实例 processInstance = runtimeService.startProcessInstanceByKey( "leaveProcess", businessKey="2023001" );数据影响:
act_ru_execution生成主执行记录act_ru_task创建首个任务act_hi_procinst记录实例开始act_hi_taskinst初始化任务
阶段三:审批流转当张三提交请假申请后:
act_ru_task更新为李四的审批任务act_hi_actinst记录"提交申请"节点完成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;历史数据归档策略
- 定期清理:配置HistoryService的清理策略
- 分表存储:按业务日期水平分表
- 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. 常见问题排查指南
问题一:流程卡死排查步骤:
- 检查
act_ru_task是否存在待办任务 - 查询
act_ru_execution确认当前节点 - 查看
act_ru_event_subscr事件订阅
问题二:变量丢失解决方案:
- 检查变量作用域(流程级/任务级)
- 验证变量类型是否支持序列化
- 排查
act_ge_bytearray中的异常数据
问题三:性能瓶颈优化方向:
- 监控
act_ru_job表中的异步作业 - 调整
asyncExecutor线程池配置 - 优化流程设计,减少并行分支
// 获取引擎健康状态 Map<String, String> props = managementService.getProperties(); String jobExecutorStatus = props.get("jobExecutorActivate");理解Activiti的数据库设计后,曾经的黑盒操作现在变得透明可见。建议在日常开发中多结合数据库状态分析问题,这种"数据库视角"的调试方法往往能快速定位问题根源。
