docs: 记录管线/管件初始化 sqlite 访问的分析与缓存方案 #88

Merged
gjm merged 2 commits from company-desktop/company-desktop-computer/perf-pipe-style-sqlite-cache AGit into main 2026-10-28 10:11:32 +08:00
Collaborator

新增 sqlite_query_cache.md:定位 AecDbEwPipe / AecDbEwFitting 的
dwgInFields 回填样式键时每个实体最多 16 次 sqlite3_open 的成因,
给出 4 个 getter 合并 SQL + 进程级缓存的方案、收益对比、风险取舍
与实施记录。

新增 sqlite_query_cache.md:定位 AecDbEwPipe / AecDbEwFitting 的 dwgInFields 回填样式键时每个实体最多 16 次 sqlite3_open 的成因, 给出 4 个 getter 合并 SQL + 进程级缓存的方案、收益对比、风险取舍 与实施记录。
company-desktop added 2 commits 2026-10-28 10:09:30 +08:00
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 全部通过。
新增 sqlite_query_cache.md:定位 AecDbEwPipe / AecDbEwFitting 的
dwgInFields 回填样式键时每个实体最多 16 次 sqlite3_open 的成因,
给出 4 个 getter 合并 SQL + 进程级缓存的方案、收益对比、风险取舍
与实施记录。
gjm approved these changes 2026-10-28 10:11:29 +08:00
gjm merged commit dc6bf80e9c into main 2026-10-28 10:11:32 +08:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gjm/envi-code#88