DB 驱动统一 第二步:消除最后两个驱动旁路(#2)

DB 驱动统一 第二步:消除最后两个驱动旁路(#2)

日期:2026-07-15 23:50-24:10

前置:#1 已确认 9 个 API 404 是 dispatch 缺失(与 DB 无关),报告见 api_404_dispatch_missing_20260715.md

改动目标

将运行时仅剩的两个非 better-sqlite3 驱动引用统一到 sqlite-compat 单例:

  • server/services/ai-task-manager.js:原用原生 sqlite3 回调驱动
  • server/routes/ai-inspector.js:内部残留 sql.js 内存快照读路径(getSciotDb 旧实现 + initSqlJsOnce + 模块初始化 IIFE 依赖 sql.js)

改动明细

1. ai-task-manager.js(重写 DB 层,调用方零改动)

  • 移除 require('sqlite3'),改为 require('../db-adapter')(sqlite-compat 薄包装)。
  • 构造签名 new AiTaskManager(dbPath) 不变;init() 改用 dbAdapter.createDatabase(this.dbPath) 获取单例。
  • 所有业务方法(createTask/getTask/updateTask/listTasks/getProcessingCount/cleanupOldTasks)保留 async + Promise 接口,内部用 __run/__get/__all/__exec 封装 better-sqlite3 同步调用,对 file-agent.js / file-business.js 零改动
  • cleanupOldTasksthis.changes 在 better-sqlite3 下不可用,改为返回 0(清理功能本就非关键路径,且内存模式原也返回 0)。
  • close() 改为不再主动 close 共享单例(避免关闭其他模块正在用的连接)。
  • 单例键:ai_tasks.dbrule_engine.db 路径不同,sqlite-compat 按规范化路径分别单例,互不干扰。

2. ai-inspector.js(消除 sql.js 残留)

  • getSciotDb()(L40):原 new SQL.Database(buf) 只读内存快照 → 改为 sqliteCompat.createDatabase(sciot_import.db) 单例。
  • L1115 的 sdb.exec("...")[0]?.values[0][0](sql.js 特有 API)→ 改写为 prepare().get()/.all()(compat 兼容)。
  • 模块初始化 IIFE:移除 const SQL = await initSqlJsOnce() 依赖,改为直接 sqliteCompat.init() + getDb() 同步内置规则。
  • 删除死代码 initSqlJsOnce()_sqlJsReady 变量(已无调用方)。
  • getDb() 内部移除 if (!_sqlJsReady ...) return null 守卫。

验证结果

检查项结果
ai-task-manager.js 语法OK
ai-inspector.js 语法OK
全仓 require('sqlite3') 运行时引用0 处(已清零)
全仓 require('sql.js') 运行时引用0 处(scripts/ 下 3 处为构建脚本,非运行时)
require('better-sqlite3') 唯一引用点sqlite-compat.js:25(单驱动单点)
服务启动PID 34168 监听 3006
/api/health200
/api/rule-engine/stats200,total=2413,active=2386(与#1后基准一致,无回归)
/api/ai-inspector/rules?include_sciot=true200,success=true,rules=66(模块加载正常,sql.js→compat 改写生效)

已知无害告警

启动日志中 [RuleEngine] 列迁移失败 ... duplicate column name 为历史 ALTER TABLE 重复执行,列已存在,better-sqlite3 FAILFAST 正确报错(原 sql.js 静默吞掉)。不影响功能。

备份

  • server/services/ai-task-manager.js.bak-20260715
  • server/routes/ai-inspector.js.bak-20260715

现状总结(DB 驱动统一三步法全部完成)

  1. 止血:重写 sqlite-compat 为 better-sqlite3 单例 + 路径归一 + FAILFAST ✅(前序)
  2. 堵旁路:ai-task-manager(sqlite3) / ai-inspector(sql.js) 已并入单例 ✅(本轮)
  3. 路径归一:14+ 处 rule_engine.db 引用统一,幽灵库清理 ✅(前序)

运行时数据路径驱动现状:

  • better-sqlite3:唯一真实驱动,通过 sqlite-compat 单例
  • sql.js:运行时 0 处(仅 scripts/ 构建脚本使用,不影响运行)
  • sqlite3:运行时 0 处
  • mysql2:11 处(外部业务库,合理保留)

tech-debt(独立排期,非本轮):

  • server/scripts/*.js 的 sql.js 构建脚本(非运行时,可后续统一)
  • 310 个良性空 catch 审计(不改)
  • 14 个 .db 物理文件合并(独立任务)
← 返回案例列表
分享:
🤖 Try Now →
🤖
🎁