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:

相关推荐
正儿八经的少年40 分钟前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存
xrandzj1 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉1 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
denggun123451 小时前
yield
前端·数据库·python
ltl2 小时前
SQLite Rollback Journal:写前拷贝与提交点
数据库
ltl2 小时前
TiFlash Learner:Raft 日志如何进列存
数据库
ltl2 小时前
BM25 与 Lucene Similarity:公式如何落到 postings
数据库
ltl2 小时前
RocksDB Block Cache 与 Bloom Filter:读放大怎么裁
数据库
deli0070074 小时前
JSON 树形查看器:粘贴即解析,折叠展开一目了然
前端·数据库·json·ai编程
国科安芯4 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座