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 零改动。 cleanupOldTasks的this.changes在 better-sqlite3 下不可用,改为返回 0(清理功能本就非关键路径,且内存模式原也返回 0)。close()改为不再主动 close 共享单例(避免关闭其他模块正在用的连接)。- 单例键:
ai_tasks.db与rule_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/health | 200 |
| /api/rule-engine/stats | 200,total=2413,active=2386(与#1后基准一致,无回归) |
| /api/ai-inspector/rules?include_sciot=true | 200,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 驱动统一三步法全部完成)
- 止血:重写 sqlite-compat 为 better-sqlite3 单例 + 路径归一 + FAILFAST ✅(前序)
- 堵旁路:ai-task-manager(sqlite3) / ai-inspector(sql.js) 已并入单例 ✅(本轮)
- 路径归一: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 物理文件合并(独立任务)
BossAgents