当前位置: 首页 > news >正文

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

http://www.gsyq.cn/news/1458913.html

相关文章:

  • DLSS Swapper终极指南:3分钟学会游戏性能优化神器
  • AI巡检,让CMDB更干净
  • 莫瑶教育全品类AI课程全景解读:三大黄金赛道,覆盖从技术研发到商业变现的全链路成长路径 - 全国职业学校推荐官
  • 8款最佳AI视频生成器及使用方法(2026)
  • 保姆级教程:用FrontEnd Plus和十六进制编辑器破解Java试用版限制(附字节码修改原理)
  • 2026实测|英文论文AI率94%降至7%:5款结构级降AI工具推荐 - 降AI实验室
  • 从零到一:在CentOS服务器上为Tesla K80双卡配置CUDA深度学习环境(实测记录)
  • 别再只用@Scheduled了!手把手教你搭建可管理、可持久化的Quartz+PostgreSQL任务中心
  • 深度整合ai开发力量:在快马平台实现比idea ai插件更强大的智能结对编程助手
  • ubuntu 无权限安装多个cuda和cudnn
  • 郑州市 家电维修清洗上门|维小达空调、冰箱、洗衣机、热水器、电视、油烟机灶具、消毒柜、小家电一站式维保清洗服务 - 维小达科技
  • 基于深度学习+AI的电梯内电动车目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
  • 用Multisim 14.2从零搭建一个三路抢答器:我的课程设计实战与避坑全记录
  • SQL 无关联条件拼接
  • 工地PPE实时检测工具:PyQt5界面+YOLOv8模型,支持安全帽/马甲/面具三类识别
  • PHP国际化与多语言支持实现
  • 如何在5分钟内快速上手B站视频下载神器downkyi:完整使用指南
  • 性价比最高的仓储软件(WMS)怎么选 - 品牌排行榜
  • C#抽象类 接口(简答 + 答题话术)
  • PHP图像识别与QR码生成技术
  • Grok-1本地部署构建自动素材池实战指南
  • 从安装到调参:一份超详细的imbalanced-learn库实战指南(附Jupyter Notebook代码)
  • 仓储软件(WMS)值得推荐的实用选择参考 - 品牌排行榜
  • 从收藏吃灰到高效执行:2026年度高内聚代码灵感仓储工具深度解析
  • 量子退火在最小顶点多割问题中的应用与优化
  • 工单响应时效从47分钟压缩至92秒,这3个AI集成节点你绝对漏掉了
  • 百度网盘限速终结者:3分钟搞定高速下载的终极方案
  • 用超声波传感器与Arduino制作自由形态电子秤:从测距到称重的跨界实践
  • PHP图数据结构与算法实现
  • Gemma 4 9B:面向开发者的轻量级AI生产力引擎