Activiti 5.22 数据库表结构深度解析从静态定义到运行时流转当我们打开Activiti的数据库映入眼帘的是25张以ACT_开头的表。这些表并非孤立存在而是构成了一个精密的流程数据生态系统。本文将带您深入探索这些表背后的设计哲学揭示流程数据从定义到归档的完整生命周期。1. 静态与动态三类核心表的角色划分Activiti的表结构设计体现了清晰的层次划分主要分为三类核心表ACT_RE_Repository流程定义的静态存储ACT_RU_Runtime流程实例的运行时数据ACT_HI_History流程执行的历史记录这种三分法设计反映了流程引擎的核心思想定义与执行分离。让我们看一个典型流程的数据流转示例-- 部署流程定义时数据流向 INSERT INTO ACT_RE_DEPLOYMENT -- 部署记录 INSERT INTO ACT_RE_PROCDEF -- 流程定义 INSERT INTO ACT_GE_BYTEARRAY -- 流程资源文件 -- 启动流程实例时数据流向 INSERT INTO ACT_RU_EXECUTION -- 执行实例 INSERT INTO ACT_RU_TASK -- 当前任务 INSERT INTO ACT_RU_VARIABLE -- 流程变量提示运行时表(ACT_RU_)的设计遵循用完即弃原则确保引擎在运行期保持最佳性能。2. 流程实例的生命周期数据如何流动理解表结构的关键是跟踪一个流程实例的完整生命周期。以下是典型BPMN流程的数据流转路径部署阶段ACT_RE_DEPLOYMENT记录部署操作ACT_RE_PROCDEF存储解析后的流程定义ACT_GE_BYTEARRAY保存BPMN/PNG文件启动阶段ACT_RU_EXECUTION创建执行实例ACT_RU_TASK生成首个用户任务ACT_RU_VARIABLE初始化流程变量运行阶段ACT_RU_IDENTITYLINK记录任务参与者ACT_RU_EVENT_SUBSCR管理事件订阅ACT_RU_JOB处理定时任务完成阶段运行时数据从ACT_RU_表删除ACT_HI_PROCINST记录流程实例历史ACT_HI_TASKINST保存任务历史下表展示了关键表在生命周期各阶段的状态变化表类型部署阶段运行阶段完成阶段ACT_RE_写入只读只读ACT_RU_空频繁读写清空ACT_HI_空部分写入完整记录3. 核心运行时表的协作机制运行时表构成了Activiti的工作记忆它们的高效协作保证了流程的顺利执行。其中最关键的三个表是ACT_RU_EXECUTION- 流程执行实例存储当前执行的流程路径维护父子执行实例关系记录当前活动节点ACT_RU_TASK- 用户任务任务定义信息名称、优先级等任务状态新建、进行中、完成任务候选人/办理人ACT_RU_VARIABLE- 流程变量支持多种变量类型String, Integer, Serializable等作用域控制流程实例级、任务级提供变量历史追踪它们的协作关系可以通过这个Java代码示例理解// 启动流程时核心表的交互 ProcessInstance instance runtimeService.startProcessInstanceByKey(leaveProcess); // → 创建 ACT_RU_EXECUTION 记录 // → 根据流程定义创建 ACT_RU_TASK // → 初始化 ACT_RU_VARIABLE Task task taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); // → 查询 ACT_RU_TASK 表 // → 关联 ACT_RU_EXECUTION // → 可能关联 ACT_RU_IDENTITYLINK4. 历史表的归档策略与优化历史表(ACT_HI_)的设计体现了Activiti的另一个重要特性可追溯性。与运行时表不同历史表采用不同的优化策略数据保留策略默认保留所有历史数据可通过配置开启自动清理支持按时间或数量阈值清理关键历史表解析ACT_HI_PROCINST流程实例快照ACT_HI_ACTINST活动实例轨迹ACT_HI_VARINST变量变更历史历史记录的级别可以通过引擎配置调整# 历史级别配置示例 historyaudit # 默认级别记录所有历史 historyactivity # 只记录活动实例 historynone # 不记录历史注意历史级别设置会影响部分功能如流程监控、报表的可用性需根据业务需求权衡。5. 实战基于表结构的性能优化理解表结构后我们可以针对性地优化流程性能。以下是几个实用技巧运行时表优化定期监控ACT_RU_表大小避免长时间运行的流程实例使用异步执行减少锁竞争历史表优化对ACT_HI_表建立合适的索引CREATE INDEX idx_hi_procinst ON ACT_HI_PROCINST(PROC_INST_ID_); CREATE INDEX idx_hi_taskinst ON ACT_HI_TASKINST(PROC_INST_ID_);分区处理大表按时间范围配置历史清理策略变量存储优化大对象使用ACT_GE_BYTEARRAY存储频繁访问的变量考虑缓存避免在变量中存储冗余数据下表对比了不同场景下的优化策略场景问题表现优化方案影响表流程启动慢ACT_RE_PROCDEF查询耗时预热流程定义缓存ACT_RE_*任务查询慢ACT_RU_TASK全表扫描添加候选人索引ACT_RU_TASK历史数据膨胀ACT_HI_表过大配置自动清理ACT_HI_*6. 异常排查从数据库视角诊断问题当流程出现异常时表数据往往能提供关键线索。以下是常见问题的排查路径流程卡顿分析检查ACT_RU_TASK当前任务查看ACT_RU_EXECUTION执行路径验证ACT_RU_VARIABLE变量值历史流程分析-- 查找异常结束的流程实例 SELECT * FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL AND DELETE_REASON_ IS NOT NULL; -- 分析耗时最长的节点 SELECT PROC_DEF_ID_, ACT_ID_, AVG(DURATION_) FROM ACT_HI_ACTINST GROUP BY PROC_DEF_ID_, ACT_ID_;数据一致性检查对比ACT_RU_与ACT_HI_记录检查孤立的任务实例验证变量作用域一致性在实际项目中我们曾遇到一个典型案例流程实例无故消失。通过分析发现是历史表清理策略过于激进导致ACT_HI_PROCINST记录被提前删除而相关服务却依赖这些历史数据。调整历史级别配置后问题解决。
Activiti 5.22 二十五张表都存了啥?一张图帮你理清核心数据流转
发布时间:2026/5/28 3:25:28
Activiti 5.22 数据库表结构深度解析从静态定义到运行时流转当我们打开Activiti的数据库映入眼帘的是25张以ACT_开头的表。这些表并非孤立存在而是构成了一个精密的流程数据生态系统。本文将带您深入探索这些表背后的设计哲学揭示流程数据从定义到归档的完整生命周期。1. 静态与动态三类核心表的角色划分Activiti的表结构设计体现了清晰的层次划分主要分为三类核心表ACT_RE_Repository流程定义的静态存储ACT_RU_Runtime流程实例的运行时数据ACT_HI_History流程执行的历史记录这种三分法设计反映了流程引擎的核心思想定义与执行分离。让我们看一个典型流程的数据流转示例-- 部署流程定义时数据流向 INSERT INTO ACT_RE_DEPLOYMENT -- 部署记录 INSERT INTO ACT_RE_PROCDEF -- 流程定义 INSERT INTO ACT_GE_BYTEARRAY -- 流程资源文件 -- 启动流程实例时数据流向 INSERT INTO ACT_RU_EXECUTION -- 执行实例 INSERT INTO ACT_RU_TASK -- 当前任务 INSERT INTO ACT_RU_VARIABLE -- 流程变量提示运行时表(ACT_RU_)的设计遵循用完即弃原则确保引擎在运行期保持最佳性能。2. 流程实例的生命周期数据如何流动理解表结构的关键是跟踪一个流程实例的完整生命周期。以下是典型BPMN流程的数据流转路径部署阶段ACT_RE_DEPLOYMENT记录部署操作ACT_RE_PROCDEF存储解析后的流程定义ACT_GE_BYTEARRAY保存BPMN/PNG文件启动阶段ACT_RU_EXECUTION创建执行实例ACT_RU_TASK生成首个用户任务ACT_RU_VARIABLE初始化流程变量运行阶段ACT_RU_IDENTITYLINK记录任务参与者ACT_RU_EVENT_SUBSCR管理事件订阅ACT_RU_JOB处理定时任务完成阶段运行时数据从ACT_RU_表删除ACT_HI_PROCINST记录流程实例历史ACT_HI_TASKINST保存任务历史下表展示了关键表在生命周期各阶段的状态变化表类型部署阶段运行阶段完成阶段ACT_RE_写入只读只读ACT_RU_空频繁读写清空ACT_HI_空部分写入完整记录3. 核心运行时表的协作机制运行时表构成了Activiti的工作记忆它们的高效协作保证了流程的顺利执行。其中最关键的三个表是ACT_RU_EXECUTION- 流程执行实例存储当前执行的流程路径维护父子执行实例关系记录当前活动节点ACT_RU_TASK- 用户任务任务定义信息名称、优先级等任务状态新建、进行中、完成任务候选人/办理人ACT_RU_VARIABLE- 流程变量支持多种变量类型String, Integer, Serializable等作用域控制流程实例级、任务级提供变量历史追踪它们的协作关系可以通过这个Java代码示例理解// 启动流程时核心表的交互 ProcessInstance instance runtimeService.startProcessInstanceByKey(leaveProcess); // → 创建 ACT_RU_EXECUTION 记录 // → 根据流程定义创建 ACT_RU_TASK // → 初始化 ACT_RU_VARIABLE Task task taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); // → 查询 ACT_RU_TASK 表 // → 关联 ACT_RU_EXECUTION // → 可能关联 ACT_RU_IDENTITYLINK4. 历史表的归档策略与优化历史表(ACT_HI_)的设计体现了Activiti的另一个重要特性可追溯性。与运行时表不同历史表采用不同的优化策略数据保留策略默认保留所有历史数据可通过配置开启自动清理支持按时间或数量阈值清理关键历史表解析ACT_HI_PROCINST流程实例快照ACT_HI_ACTINST活动实例轨迹ACT_HI_VARINST变量变更历史历史记录的级别可以通过引擎配置调整# 历史级别配置示例 historyaudit # 默认级别记录所有历史 historyactivity # 只记录活动实例 historynone # 不记录历史注意历史级别设置会影响部分功能如流程监控、报表的可用性需根据业务需求权衡。5. 实战基于表结构的性能优化理解表结构后我们可以针对性地优化流程性能。以下是几个实用技巧运行时表优化定期监控ACT_RU_表大小避免长时间运行的流程实例使用异步执行减少锁竞争历史表优化对ACT_HI_表建立合适的索引CREATE INDEX idx_hi_procinst ON ACT_HI_PROCINST(PROC_INST_ID_); CREATE INDEX idx_hi_taskinst ON ACT_HI_TASKINST(PROC_INST_ID_);分区处理大表按时间范围配置历史清理策略变量存储优化大对象使用ACT_GE_BYTEARRAY存储频繁访问的变量考虑缓存避免在变量中存储冗余数据下表对比了不同场景下的优化策略场景问题表现优化方案影响表流程启动慢ACT_RE_PROCDEF查询耗时预热流程定义缓存ACT_RE_*任务查询慢ACT_RU_TASK全表扫描添加候选人索引ACT_RU_TASK历史数据膨胀ACT_HI_表过大配置自动清理ACT_HI_*6. 异常排查从数据库视角诊断问题当流程出现异常时表数据往往能提供关键线索。以下是常见问题的排查路径流程卡顿分析检查ACT_RU_TASK当前任务查看ACT_RU_EXECUTION执行路径验证ACT_RU_VARIABLE变量值历史流程分析-- 查找异常结束的流程实例 SELECT * FROM ACT_HI_PROCINST WHERE END_TIME_ IS NOT NULL AND DELETE_REASON_ IS NOT NULL; -- 分析耗时最长的节点 SELECT PROC_DEF_ID_, ACT_ID_, AVG(DURATION_) FROM ACT_HI_ACTINST GROUP BY PROC_DEF_ID_, ACT_ID_;数据一致性检查对比ACT_RU_与ACT_HI_记录检查孤立的任务实例验证变量作用域一致性在实际项目中我们曾遇到一个典型案例流程实例无故消失。通过分析发现是历史表清理策略过于激进导致ACT_HI_PROCINST记录被提前删除而相关服务却依赖这些历史数据。调整历史级别配置后问题解决。