问题本质
PipeStandardStore:是把三张原始表缓存、并且做关联组装后的业务聚合模型。
现状:每次用都 new + Rebuild();多处调用就要重复构建;数据库配置运行期基本不变,但现在生命周期完全由调用方控制,容易出现:重复加载、多处实例不一致、忘记Rebuild拿到空数据、多地方各自持有副本内存浪费。
前提:管线标准模板库,运行时绝大部分时间只读;只有切换标准库/修改sqlite模板文件时才需要重新加载。
下面给你几种可选方案,按适用场景对比,不写代码,只讲设计思路、优缺点、适用场景。
方案1:单例模式(全局唯一实例)
思路:PipeStandardStore做成单例,全局只有一份聚合数据。
- 初始化时机:程序启动/插件Initialize阶段执行一次Load+Rebuild;
- 各处业务直接拿单例实例,不用new;
- 提供一个手动刷新入口,当切换标准库文件、修改sqlite模板时,手动调用刷新,重新读取三张表重建内存模型。
优点
- 全项目各处拿到同一份数据,不会出现A处刷新了B处还是旧数据;
- 只做一次全表读取组装,性能最好;
- 使用最简单,业务代码不用关心构建过程。
缺点&风险
- 全局状态;如果未来要同时打开多个不同标准库(多sqlite库并行),原生单例就直接废掉,只能存一套标准;
- 插件场景要注意生命周期:插件卸载时要清空缓存,防止内存泄漏;
- 单元测试不太友好,单例很难mock替换数据。
<