问题:每次 mysql_real_connect 开销很大(TCP 握手 + MySQL 握手)。Phase 1-4 每个业务操作都 new 一个 MySQL 对象 →connect → 用完析构关闭。高并发下连接数爆炸且性能差。
第 19 步:ConnectionPool 单例
文件:include/server/db/connectionpool.hpp
cpp
class ConnectionPool {
public:
static ConnectionPool *instance(); // 单例
void init(host, user, passwd, db, port, poolSize); // 预建 poolSize 个连接
MYSQL *acquire(int maxWaitMs = 3000); // 获取连接
void release(MYSQL *conn); // 归还连接
private:
queue<MYSQL*> pool_;
mutex mtx_;
condition_variable cv_;
};
// 关键设计 --- acquire(0) 非阻塞:
MYSQL *acquire(int maxWaitMs = 3000) {
unique_lock<mutex> lock(mtx_);
if (pool_.empty()) {
if (maxWaitMs == 0) return nullptr; // ← 立即返回,绝不等待!
cv_.wait_for(lock, chrono::milliseconds(maxWaitMs), ...);
}
// ...取连接
}
// 业务代码中 acquire(0) 非阻塞 + fallback 独立连接:
bool MySQL::connect() {
_conn = ConnectionPool::instance()->acquire(0); // 尝试从池拿
if (_conn != nullptr) {
_fromPool = true;
return true;
}
// Fallback: 自己建一个短连接
_conn = mysql_init(nullptr);
MYSQL *p = mysql_real_connect(_conn, ...);
// ...
}
第 20 步:修复 Commands out of sync
问题:mysql_use_result 是流式读取------结果集必须全部读完才能发下一条SQL。线程池并发场景下,同一连接可能一个查询没读完就被另一个线程用了。
修复:db.cpp 中改 mysql_use_result → mysql_store_result:

