company-desktop/company-desktop-computer/perf-pipe-style-sqlite-cache AGit
main
新增 sqlite_query_cache.md:定位 AecDbEwPipe / AecDbEwFitting 的 dwgInFields 回填样式键时每个实体最多 16 次 sqlite3_open 的成因, 给出 4 个 getter 合并 SQL + 进程级缓存的方案、收益对比、风险取舍 与实施记录。
AecDbEwPipe / AecDbEwFitting 的 dwgInFields 会给缺失的样式键回填 颜色/线型/线宽/图层(PR #87 引入),走 CoreTools 的 4 个 getter; 每个 getter 都新建 CUIISQLiteServer 开一次 Plumbing.db,内部又调 getCurrentPipeSysTblName 再开一次。单实体最多 16 次 sqlite3_open, 几百个实体的图纸即几千次串行开库;绘制路径(setInfo2Ent / setInfo2Dc)同样走这 4 个 getter。 改为:一条 SQL 取全 COLOR/LINETYPE/LINEWIDTH/LAYNAME,结果按 「表名 + 系统名 + 中心线/外边线」做进程级缓存;表名本身按 getCurrentTrade() 缓存。首次 2 次开库,之后全部内存命中。 - 只改 CoreCommand/CoreTools.cpp,对外签名不变,192 处调用点全覆盖 (CoreLibrary / PipelineCmd / PipelineSpecCmd / HvacCmd) - 缓存只存字符串,AcDbObjectId 仍按当前图纸每次现解析,多文档切换 不串图层/线型 - 保持原语义:库打不开时 getColorByPipeSys 返回 256、getLtByPipeSys 与 getLyByPipeSys 返回空 id、getLwByPipeSys 返回 0 - 缓存生命周期等于进程,改系统样式配置需重启生效;静态对象用故意 不释放的指针持有,避免 DLL 卸载期析构顺序问题 - getPipeColorBySystem 未动:它的 SQL 不带 PIPESYS 过滤,语义与这 4 个 getter 不同,且唯一调用点已被注释 编译验证:R190 Debug 下 AecRxBase / CoreCommand_BAL_REMOTE / CoreLibrary_BAL_REMOTE / CoreImplement 全部通过。
No dependencies set.
The note is not visible to the blocked user.
新增 sqlite_query_cache.md:定位 AecDbEwPipe / AecDbEwFitting 的
dwgInFields 回填样式键时每个实体最多 16 次 sqlite3_open 的成因,
给出 4 个 getter 合并 SQL + 进程级缓存的方案、收益对比、风险取舍
与实施记录。