Hical 踩坑实录五部曲(五):Boost.MySQL 协程集成的 5 个坑
Hical 踩坑实录五部曲(五):Boost.MySQL 协程集成的 5 个坑 引言 Hical 的数据库模块(src/db/)是一个基于协程的连接池 + 中间件系统,后端使用 Boost.MySQL 的 any_connection。从 “能跑” 到 “能在生产环境跑”,中间踩了不少坑。 这篇文章记录了 Boost.MySQL 协程集成过程中遇到的 5 个真实问题,每个都附带完整的解决方案代码。 目录 Hical 踩坑实录五部曲(五):Boost.MySQL 协程集成的 5 个坑 引言 目录 坑 1:any_connection vs 强类型连接的取舍 坑 2:PreparedStatement 失效与自动重试 坑 3:SET NAMES 注入风险——validateCharset 白名单 坑 4:连接池 acquire 超时的竞争窗口 坑 5:事务忘记 commit/rollback 的自动回滚设计 第一道防线:DbMiddleware 洋葱模型 第二道防线:连接池 release 兜底回滚 附:StmtCache LRU 缓存设计 总结:Boost.MySQL 集成检查清单 坑 1:any_connection vs 强类型连接的取舍 现象:第一版连接池用 Boost.MySQL 的强类型连接(tcp_ssl_connection),结果泛型代码全部被迫模板化——编译时间爆炸,且无法在运行时根据配置切换 TCP/SSL。 强类型方式的问题: 1 2 3 4 5 6 7 8 9 10 11 // ❌ 强类型——泛型代码必须模板化 template <typename Connection> class DbPool { std::vector<std::unique_ptr<Connection>> idle_; // Connection 是 tcp_connection 还是 tcp_ssl_connection? // 中间件也要模板化、查询日志也要模板化... }; // 编译时决定,运行时无法切换 using Pool = DbPool<boost::mysql::tcp_ssl_connection>; 解决方案:any_connection——类型擦除,运行时决定传输层: ...