当前位置: 首页 > 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.jsqmd.com/news/947400/

相关文章:

  • 工业吸尘器品牌选择要点:从性能到服务的全面解析 - 品牌排行榜
  • XUnity.AutoTranslator终极指南:开启游戏无障碍翻译新时代
  • 在 Rust 中从头开始训练 LLM
  • Step 3.5 Flash:面向工业API的7B大模型推理范式重构
  • 2026 江苏南通全域商铺 / 办公室工装优选榜单|门面整装、商场改造、写字楼翻新 3 家正规装修企业实测测评 + 本地化避坑全攻略 - 本地便民网
  • DLSS Swapper终极指南:3分钟学会游戏性能优化神器
  • 别再被0.1+0.2≠0.3搞懵了!从IEEE 754标准出发,手把手带你理解浮点数的‘规格化’与‘非规格化’
  • AI巡检,让CMDB更干净
  • 工业智能一体机和商用一体机差价在哪?拆开看内部
  • 评价超高!这家固定式集装箱翻转机直销厂家究竟有何过人之处?
  • 莫瑶教育全品类AI课程全景解读:三大黄金赛道,覆盖从技术研发到商业变现的全链路成长路径 - 全国职业学校推荐官
  • 告别示教器:用C#写个WinForm小工具,实时监控ABB机器人状态和日志
  • 金融大模型社招|RAG 搜索 / 大模型算法 / 大模型安全
  • 8款最佳AI视频生成器及使用方法(2026)
  • 别再对着型号发愁了!手把手教你解读国产DJ接插件命名规则(附AMP对照表)
  • DeepSeek-V4深度解析:长记忆与强Agent协同架构
  • 3分钟颠覆传统:百度网盘提取码智能获取工具如何重构你的数字资源世界
  • 保姆级教程:用FrontEnd Plus和十六进制编辑器破解Java试用版限制(附字节码修改原理)
  • 零基础福音:在快马平台跟着ai生成的互动指南完成python首次安装
  • LLVM IR指令避坑指南:`nuw`/`nsw`、`exact`这些关键字用错了会怎样?
  • 质量好的工业吸尘器选购要点与品牌解析 - 品牌排行榜
  • 【Redis从入门到精通】第44篇:Sentinel启动与监控——它是怎么盯着主服务器的
  • 实战指南:基于快马生成生产级PyTorch模型推理镜像与部署方案
  • PHP风控系统与反欺诈策略
  • 学生编程入门最佳AI编程工具最新推荐:8款实测工具搞定作业、课程项目与竞赛
  • 让 Agent 具备业务常识的三种策略
  • 别再死记硬背!用‘客户服务系统’实战案例,轻松搞懂UML类图与包图设计
  • 从零到一:在CentOS服务器上为Tesla K80双卡配置CUDA深度学习环境(实测记录)
  • 2026实测|英文论文AI率94%降至7%:5款结构级降AI工具推荐 - 降AI实验室
  • MyBatis-Plus更新数据实战:从单字段修改到复杂条件更新的完整配置流程