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——类型擦除,运行时决定传输层: ...

May 11, 2026 · 8 min · 1605 words

从零构建现代C++ Web服务器(六):数据库中间件与协程连接池

从零构建现代C++ Web服务器(六):数据库中间件与协程连接池 系列导航:第一篇:设计理念 | 第二篇:协程与内存池 | 第三篇:路由、中间件与SSL | 第四篇:实战与性能 | 第五篇:Cookie、Session与文件服务 | 第六篇:数据库中间件(本文) 前置知识 阅读过本系列前五篇(特别是第二篇的协程基础和第三篇的中间件洋葱模型) 了解 SQL 基础和 MySQL 数据库操作 了解连接池的基本概念 目录 1. Web 框架为什么需要数据库层 2. 架构总览:六层洋葱 3. 后端抽象:DbConnection 接口 4. MySQL 实现:any_connection 封装 5. LRU PreparedStatement 缓存 6. 协程连接池:用 steady_timer 做信号量 7. DB 中间件:请求级连接生命周期 8. 查询日志:装饰器模式的妙用 9. 综合实战:用户管理 API + 数据库 10. 总结 1. Web 框架为什么需要数据库层 前五篇构建了 hical 的完整 HTTP 骨架——协程驱动的异步 I/O、PMR 内存池、路由、中间件、SSL、Cookie/Session、静态文件。但现实中的 Web 服务几乎都绑定数据库:用户注册要写库、商品查询要读库、交易扣款要事务。 如果把数据库操作留给业务代码自行处理,会出现几个典型问题: 问题 后果 每个请求都新建连接 MySQL 握手 + 认证 ≈ 1-3ms,高并发下成为瓶颈 业务代码管理连接生命周期 忘记关闭 → 连接泄漏,异常时忘记回滚 → 数据不一致 手动拼接 SQL SQL 注入漏洞(游戏服务器的经济系统被注入 = 灾难) 同步 MySQL 客户端 mysql_query() 阻塞 io_context 线程 → 吞吐暴跌 hical v2.3.0 补齐了这最后一块拼图: ...

April 30, 2026 · 20 min · 4080 words

Boost.MySQL 学习课程:异步数据库访问

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 课程 1: Boost.System(error_code、system_error) 课程 2: Boost.Asio(io_context、协程、co_await + use_awaitable) SQL 基础(SELECT/INSERT/UPDATE/DELETE、事务) MySQL 数据库基本操作 学习目标 完成本课程后,你将能够: 理解 Boost.MySQL 的类型擦除连接模型(any_connection) 使用 C++20 协程执行异步数据库操作 掌握参数化查询和 PreparedStatement 防 SQL 注入 理解结果集类型体系(results / static_results) 实现事务控制(BEGIN/COMMIT/ROLLBACK) 读懂 Hical 的连接池、Statement 缓存和数据库中间件设计 目录 前置知识 学习目标 目录 1. 核心概念 1.1 Boost.MySQL 的定位 1.2 连接类型体系 1.3 查询执行模型 1.4 结果集类型体系 2. 基础用法 2.1 建立连接 2.2 执行文本查询 2.3 参数化查询(客户端格式化) 2.4 PreparedStatement 2.5 结果集遍历 2.6 事务控制 3. 进阶主题 3.1 类型擦除连接 any_connection 3.2 静态类型结果集 static_results 3.3 多结果集(存储过程) 3.4 连接池 connection_pool 3.5 错误处理与诊断 4. Hical 实战解读 4.1 MysqlConnection:any_connection 的框架封装 4.2 StmtCache:LRU PreparedStatement 缓存 4.3 DbConnectionPool:协程式连接池 4.4 DbMiddleware:请求级连接生命周期 4.5 DbQueryLog:查询日志装饰器 4.6 完整请求处理流程 5. 练习题 练习 1:协程式 CRUD 练习 2:参数化查询实战 练习 3:事务与错误处理 练习 4:LRU 缓存设计 练习 5(挑战):连接池实现 6. 总结与拓展阅读 核心 API 速查表 查询方式对比 拓展阅读 课程回顾 1. 核心概念 1.1 Boost.MySQL 的定位 Boost.MySQL 是一个纯异步的 MySQL 客户端库,直接实现 MySQL 客户端/服务器协议(不依赖 libmysqlclient),天然集成 Boost.Asio 的异步模型。 ...

April 29, 2026 · 38 min · 7911 words