用 Hical + MySQL 5 分钟搭建 CRUD API(C++20 协程版)
C++ 访问数据库难吗?2026 年不再难了。本文用 Hical 的协程 DB 中间件,带你从零搭建一个完整的 MySQL CRUD API —— 连接池管理、事务自动提交/回滚、慢查询检测,全部开箱即用,代码比大多数 Python 教程还简洁。
三种姿势对比
| 方式 | 代码量 | 连接池 | 异步 | 防注入 |
|---|---|---|---|---|
裸 mysql_query | 多,手动管理连接 | 手写 | 阻塞 | 手拼字符串,危险 |
| ORM(如 ODB) | 少,但有运行时膨胀 | 内置 | 视实现而定 | 安全 |
| Hical 协程中间件 | 少,原生协程 | 内置 | 非阻塞 co_await | PreparedStatement |
Hical 走第三条路:连接池是协程化的,查询全部走 PreparedStatement 防注入,事务在中间件层自动管理,业务代码只关心 SQL 逻辑。
环境准备
构建启用数据库支持
| |
依赖说明
- Boost >= 1.85(DB 中间件需要 Boost.MySQL,1.85 版引入
any_connection) - OpenSSL(MySQL TLS 连接可选,已是框架强依赖)
- CMakeLists 里加一行即可:
| |
建表 SQL
| |
完整 main.cpp
约 80 行,包含连接池初始化、中间件注册、4 个 CRUD 路由:
| |
快速测试
| |
自动事务详解
autoTransaction = true 的效果:中间件在路由执行前自动 BEGIN,路由正常返回后自动 COMMIT,抛出异常时自动 ROLLBACK。
这意味着业务代码里完全不需要写事务控制。来看一个转账场景:
| |
异常路径下,中间件的洋葱后置阶段会自动调用 conn->rollback(),无需业务层操心。
如果需要手动控制事务(例如部分提交),将 autoTransaction 设为 false,然后自己调用:
| |
慢查询检测
makeQueryLogMiddleware 必须在 makeDbMiddleware 之后注册(它依赖请求中已注入的连接):
| |
QueryLogEntry 的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
sql | std::string | 原始 SQL 文本 |
duration | std::chrono::microseconds | 执行耗时 |
rowCount | size_t | 返回行数(SELECT) |
affectedRows | uint64_t | 影响行数(DML) |
isParameterized | bool | 是否使用了参数化查询 |
连接池参数调优
| 参数 | 默认值 | 推荐场景 |
|---|---|---|
minConnections | 2 | 低流量服务保持 2-4,避免冷启动延迟 |
maxConnections | 16 | 单机 Web 服务通常 16-32,不超过 MySQL max_connections 的 1/4 |
idleTimeout | 300s | MySQL 默认 wait_timeout 8h,设 5 分钟绰绰有余 |
acquireTimeout | 5s | 池满等待上限;超时返回 503 而非无限阻塞 |
queryTimeout | 30s | 防止慢查询耗尽所有连接;OLTP 场景建议设 3-5s |
healthCheckInterval | 30s | 定期 ping 空闲连接,防止 MySQL 服务端主动断开 |
pingGracePeriod | 15s | 距上次 ping 不超过 15s 则跳过,减少不必要的往返 |
stmtCacheSize | 64 | 每连接 LRU 缓存容量,见下节 |
高并发写入场景参考配置:
| |
PreparedStatement 缓存(stmtCacheSize)
每次 query() / execute() 调用都会走 PreparedStatement —— 这是 Hical 防 SQL 注入的核心机制。但每次都向 MySQL 发送 PREPARE 请求会有网络往返开销。
stmtCacheSize 控制每个连接维护的 LRU 缓存容量(默认 64 条):
- 首次执行某条 SQL → 发送
PREPARE,缓存句柄 - 后续执行同一 SQL → 直接复用缓存句柄,零额外往返
- 缓存满时 → 淘汰最久未使用的语句(LRU),释放资源
| |
实测:对同一 SQL 的第二次调用,耗时从 ~1.2ms(含 PREPARE RTT)降到 ~0.3ms(纯执行)。在 QPS 较高的接口上效果明显。
总结
Hical 的 DB 中间件把连接池、事务、PreparedStatement 三件最繁琐的事情统一封装,让 C++20 协程写出的数据库代码和 Go/Python 一样直白:co_await conn->query(sql, params) 取结果,中间件自动搞定其余一切。
有兴趣可查看 Hical 框架源码地址:github.com/Hical61/Hical