当前位置: 首页 > news >正文

MySQL 连接池 (Pool) 常用方法详解

MySQL 连接池 (Pool) 常用方法详解

1. 创建连接池

首先需要创建连接池实例:

const mysql = require('mysql2/promise'); // 使用Promise版本const pool = mysql.createPool({host: 'localhost',user: 'root',password: 'password',database: 'test',waitForConnections: true,connectionLimit: 10, // 最大连接数queueLimit: 0 // 无限制的排队请求
});

2. 核心方法

2.1 pool.query(sqlString, [values])

  • 作用:执行SQL查询的最简单方法
  • 特点
    • 自动获取和释放连接
    • 支持参数化查询
  • 返回值[rows, fields]
  • 示例
const [rows] = await pool.query('SELECT * FROM users WHERE age > ?', [18]);

2.2 pool.execute(sqlString, [values])

  • 作用:执行预处理语句
  • 特点
    • query()更高效(特别是重复查询)
    • 自动创建和缓存预处理语句
  • 返回值[rows, fields]
  • 示例
const [rows] = await pool.execute('SELECT * FROM products WHERE price > ?', [100]);

2.3 pool.getConnection()

  • 作用:显式获取一个连接
  • 使用场景
    • 需要执行事务
    • 需要执行多个相关查询
  • 注意:必须手动释放连接
  • 示例
const connection = await pool.getConnection();
try {// 使用connection执行查询
} finally {connection.release(); // 必须释放
}

3. 连接对象(Connection)方法

通过getConnection()获取的连接对象有以下方法:

3.1 connection.query()

  • pool.query(),但在特定连接上执行

3.2 connection.execute()

  • pool.execute(),但在特定连接上执行

3.3 connection.beginTransaction()

  • 作用:开始事务
  • 示例
await connection.beginTransaction();

3.4 connection.commit()

  • 作用:提交事务
  • 示例
await connection.commit();

3.5 connection.rollback()

  • 作用:回滚事务
  • 示例
await connection.rollback();

3.6 connection.release()

  • 作用:释放连接回连接池
  • 重要:必须调用,否则会导致连接泄漏

4. 连接池管理方法

4.1 pool.end()

  • 作用:优雅关闭连接池
  • 示例
await pool.end(); // 关闭所有连接

4.2 pool.escape(value)

  • 作用:手动转义值
  • 示例
const name = pool.escape(userInput); // 防止SQL注入

4.3 pool.escapeId(identifier)

  • 作用:转义标识符(表名、列名)
  • 示例
const tableName = pool.escapeId('user table');

5. 事务处理完整示例

const connection = await pool.getConnection();
try {await connection.beginTransaction();// 执行多个操作await connection.query('UPDATE accounts SET balance = balance - ? WHERE id = ?', [100, 1]);await connection.query('UPDATE accounts SET balance = balance + ? WHERE id = ?', [100, 2]);await connection.commit();
} catch (err) {await connection.rollback();throw err;
} finally {connection.release();
}

6. 事件监听

连接池可以监听以下事件:

6.1 'acquire'

  • 当从池中获取连接时触发
pool.on('acquire', (connection) => {console.log('Connection %d acquired', connection.threadId);
});

6.2 'release'

  • 当连接释放回池中时触发
pool.on('release', (connection) => {console.log('Connection %d released', connection.threadId);
});

6.3 'enqueue'

  • 当查询需要等待可用连接时触发
pool.on('enqueue', () => {console.log('Waiting for available connection slot');
});

7. 最佳实践

  1. 总是使用参数化查询防止SQL注入
  2. 及时释放连接避免连接泄漏
  3. 合理设置连接池大小根据应用负载调整
  4. 事务中使用try-catch确保正确处理错误
  5. 考虑使用ORM如Sequelize、TypeORM简化复杂操作

8. 性能提示

  • 对于高频查询,使用execute()query()更高效
  • 批量操作考虑使用连接池的单个连接
  • 长时间不用的连接池应该调用end()关闭

这些方法涵盖了MySQL连接池的绝大多数使用场景,合理使用可以构建高效可靠的数据库应用。

相关文章:

  • HTML应用指南:利用POST请求获取全国达美乐门店位置信息
  • 【网络编程】UDP协议 和 Socket编程
  • Seaborn一个用于统计图形绘制的高级API
  • 基于C++数据结构双向循环链表实现的贪吃蛇
  • AgeTravel | 银发文娱旅游一周新鲜事
  • 使用高德MCP+AI编程工具打造一个旅游小助手
  • 线程同步与互斥核心要点整理
  • 精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读
  • linux安装ragflow
  • 《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》
  • Tailwind CSS 响应式设计解析(含示例)
  • 【算法练习】归并排序和归并分治
  • JAVA使用Apache POI导出Word,支持向表格动态添加多行数据
  • taro小程序如何实现大文件(视频、图片)后台下载功能?
  • 为什么要学习《金刚经》
  • [AI]browser-use + web-ui 大模型实现自动操作浏览器
  • Android项目中使用ComposeUI
  • Html 2
  • OpenGL学习笔记(延迟着色法、SSAO)
  • 「Mac畅玩AIGC与多模态07」开发篇03 - 开发第一个 Agent 插件调用应用
  • 2025年“投资新余•上海行”钢铁产业“双招双引”推介会成功举行
  • 解放日报:中国大模型企业的发展机遇已经到来
  • 证据公布!菲律宾6人非法登上铁线礁活动
  • 大学男生被捉奸后将女生推下高楼?桂林理工大学辟谣
  • 深圳宝安区一宗涉宅用地中止出让,起始总价86.27亿元
  • 连演三场,歌剧《义勇军进行曲》在上海西岸大剧院上演