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:

相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒9 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562412 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
用户713335851562413 小时前
MySQL - InnoDB 的 Buffer Pool
mysql