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
宁小法1 小时前
mysql - SQLSTATE[23000]报错类型
mysql·23000·报错类型
j_xxx404_2 小时前
MySQL库操作硬核解析:字符集、校验规则、大小写比较、备份恢复与连接排查
运维·服务器·数据库·人工智能·mysql·ai·oracle
minji...2 小时前
MySQL数据库 (五) MySQL表的约束(上),非空约束,默认值约束,零填充约束,主键约束,符合主键
数据库·mysql·表的约束·主键约束·非空约束·复合主键·零填充约束
拾贰_C2 小时前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
贺今宵2 小时前
Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库
前端·数据库·vue.js·sqlite·web
列星随旋2 小时前
MySQL面经整理
数据库·mysql
AllData公司负责人2 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与Chat2DB开源项目,建设Text2SQL生产场景全新体验的数据源平台!
数据库·人工智能·text2sql·数据中台·数据源·chat2db·智谱大模型
是一个Bug3 小时前
MySQL 核心知识梳理:从底层原理到实战优化
mysql