随便看看
发布于 2026-07-31 / 5 阅读
0

宽表学习与设计

背景: 在为flowable6.8.0 审计项目设计大屏时出现统计数据接口请求时长>10s, 对于一个商用项目来说这是不能容忍的问题

分析慢的原因

flowable提供了很多apiService供调用者使用,但是他的这些

package org.flowable.engine;
HistoryService,RuntimeService,TaskService 都存在一个问题,里面封装了很多逻辑 对于上下文的获取,查询*... 

而现在我们项目存在大量 父子流程表,比如有些大屏指标统计一个流程到哪个阶段,需要遍历当前主流程在哪个调用活动,然后进入调用活动里面继续查里面活跃的任务,然后再判断这个任务KEY是否是满足某个特定的节点,从而对这个主流程做不同的业务逻辑统计, 就光听这个业务 就可以看出这是一个N+1的Select

这是其中一个通过当前流程获取他的主流程的方法
public HistoricProcessInstance getRootProcessInstanceByProcessInstanceId(String processInstanceId) {
        if (ObjectUtil.isNull(processInstanceId)) {
            throw exception(PROCESS_INSTANCE_NOT_EXISTS);
        }
        HistoricProcessInstance rootProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        while (rootProcessInstance.getSuperProcessInstanceId() != null) {
            rootProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(rootProcessInstance.getSuperProcessInstanceId()).singleResult();
        }
        return rootProcessInstance;
    }

宽表的概念

概念

结构上来看就是一张字段很多的表,从数据上看 他是基于多个表中核心字段来源的打平汇总 表.天生适合查询

用途

面多大屏这种大部分接口都是从不同模块中group,join...批量|聚合 统计出数据的情况,生成一张汇总表可以大幅度提高 接口查询速度,本质就是破坏SQL范式|冗余字段 =>> 用内存换速度

利用宽表解决大屏性能问题

宽表 以主流程为基础 统计流程经过的每个节点,经过数据,主流程对应的财务表,项目负责人(用户表)

但是宽表也并非没有缺点 比如实时性,内存大(字段冗余)

但是flowable的全局监听器刚好可以解决实时性问题 extends AbstractFlowableEngineEventListener

每当流程中操作就会调用这里 我们只需要在这里面写入对应task|process的同步逻辑即可

面对不是像flowable这种有 状态驱动的,可以通过切面在执行方法处加入即可,比如发布流程接口 通过一个初始化宽表方法 或者用切面 来把值记录