Phase 5:MySQL 连接池

问题:每次 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:

相关推荐
小白男神1 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客1 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql