一个从零实现的 MySQL 连接池示例项目,使用 C++11 + MySQL C API + CMake 构建。
当前项目的推荐运行方式是:
- 本地写代码
- 本地编译
test_pool - 本地运行
./bin/test_pool - Docker 只负责启动 MySQL
- 使用
std::shared_ptr<MySQL>和自定义删除器实现连接自动归还 - 使用生产者 / 消费者双条件变量降低高并发下的无效唤醒
- 支持按配置预热连接、按需补充连接
- 支持配置文件解析与合法性校验
.
├── CMakeLists.txt
├── docker-compose.yml
├── autobuild.sh
├── config/
│ └── connection_pool.conf.example
├── docker/mysql/init/
│ └── 01-init-connection-pool.sql
├── example/
│ └── main.cpp
├── include/
└── src/
本机建议准备:
- C++11 编译器
- CMake 3.10+
- MySQL 客户端开发库,例如 Ubuntu 上的
libmysqlclient-dev
程序实际读取的配置文件是 config/connection_pool.conf,仓库中保留的是模板文件 config/connection_pool.conf.example。
第一次本地运行前先复制模板:
cp config/connection_pool.conf.example config/connection_pool.conf模板默认用于宿主机本地运行:
ip=127.0.0.1
port=3306
username=connection_pool_app
password=wang112233
dbname=connection_pool_dev地址约定:
- 宿主机本地运行
./bin/test_pool时使用127.0.0.1:3306 mysql_db是 Docker Compose 网络里的 MySQL 服务名,只用于容器网络内部寻址说明
当前 docker-compose.yml 只负责:
mysql_dbmysql_data
启动:
docker compose up -d mysql_db查看状态:
docker compose ps查看日志:
docker compose logs -f mysql_db停止:
docker compose down如果你修改了初始化 SQL、数据库用户名或密码,希望让 MySQL 从零重新初始化:
docker compose down -v
docker compose up -d mysql_db如果之前用旧版编排起过 cpp_app,看到 orphan 提示时可以清理一次:
docker compose down --remove-orphans执行:
./autobuild.sh或者手动执行:
cmake -S . -B build
cmake --build build产物:
bin/test_pool
确认 mysql_db 已启动并且 config/connection_pool.conf 已存在后,直接运行:
./bin/test_poolexample/main.cpp 当前主要用于并发借还连接测试,重点验证“连接能否成功建立与复用”;它不依赖额外业务表结构,因此空数据库也可以跑通。
MySQL 首次启动时会执行:
它会创建:
- 数据库:
connection_pool_dev - 用户:
connection_pool_app - 密码:
wang112233
当你看到以下现象时,说明项目已经跑通:
mysql_db处于运行中,健康检查最终为healthy- 本地
./bin/test_pool输出多条“成功拿到连接” - 程序正常结束
第一次:
cd ~/projects/cpp_project/06_connection_pool
cp config/connection_pool.conf.example config/connection_pool.conf
docker compose up -d mysql_db
./autobuild.sh
./bin/test_pool日常开发:
cd ~/projects/cpp_project/06_connection_pool
docker compose up -d mysql_db
./autobuild.sh
./bin/test_pool