MySQL連接池(Pool)常用方法詳解
MySQL 連接池 (Pool) 常用方法詳解
1. 創(chuàng)建連接池
首先需要創(chuàng)建連接池實例:
const mysql = require('mysql2/promise'); // 使用Promise版本
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
waitForConnections: true,
connectionLimit: 10, // 最大連接數(shù)
queueLimit: 0 // 無限制的排隊請求
});
2. 核心方法
2.1 pool.query(sqlString, [values])
- 作用:執(zhí)行SQL查詢的最簡單方法
- 特點:
- 自動獲取和釋放連接
- 支持參數(shù)化查詢
- 返回值:
[rows, fields] - 示例:
const [rows] = await pool.query('SELECT * FROM users WHERE age > ?', [18]);
2.2 pool.execute(sqlString, [values])
- 作用:執(zhí)行預(yù)處理語句
- 特點:
- 比
query()更高效(特別是重復(fù)查詢) - 自動創(chuàng)建和緩存預(yù)處理語句
- 比
- 返回值:
[rows, fields] - 示例:
const [rows] = await pool.execute('SELECT * FROM products WHERE price > ?', [100]);
2.3 pool.getConnection()
- 作用:顯式獲取一個連接
- 使用場景:
- 需要執(zhí)行事務(wù)
- 需要執(zhí)行多個相關(guān)查詢
- 注意:必須手動釋放連接
- 示例:
const connection = await pool.getConnection();
try {
// 使用connection執(zhí)行查詢
} finally {
connection.release(); // 必須釋放
}
3. 連接對象(Connection)方法
通過getConnection()獲取的連接對象有以下方法:
3.1 connection.query()
- 同
pool.query(),但在特定連接上執(zhí)行
3.2 connection.execute()
- 同
pool.execute(),但在特定連接上執(zhí)行
3.3 connection.beginTransaction()
- 作用:開始事務(wù)
- 示例:
await connection.beginTransaction();
3.4 connection.commit()
- 作用:提交事務(wù)
- 示例:
await connection.commit();
3.5 connection.rollback()
- 作用:回滾事務(wù)
- 示例:
await connection.rollback();
3.6 connection.release()
- 作用:釋放連接回連接池
- 重要:必須調(diào)用,否則會導(dǎo)致連接泄漏
4. 連接池管理方法
4.1 pool.end()
- 作用:優(yōu)雅關(guān)閉連接池
- 示例:
await pool.end(); // 關(guān)閉所有連接
4.2 pool.escape(value)
- 作用:手動轉(zhuǎn)義值
- 示例:
const name = pool.escape(userInput); // 防止SQL注入
4.3 pool.escapeId(identifier)
- 作用:轉(zhuǎn)義標(biāo)識符(表名、列名)
- 示例:
const tableName = pool.escapeId('user table');
5. 事務(wù)處理完整示例
const connection = await pool.getConnection();
try {
await connection.beginTransaction();
// 執(zhí)行多個操作
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. 事件監(jiān)聽
連接池可以監(jiān)聽以下事件:
6.1 'acquire'
- 當(dāng)從池中獲取連接時觸發(fā)
pool.on('acquire', (connection) => {
console.log('Connection %d acquired', connection.threadId);
});
6.2 'release'
- 當(dāng)連接釋放回池中時觸發(fā)
pool.on('release', (connection) => {
console.log('Connection %d released', connection.threadId);
});
7. 最佳實踐
- 總是使用參數(shù)化查詢防止SQL注入
- 及時釋放連接避免連接泄漏
- 合理設(shè)置連接池大小根據(jù)應(yīng)用負載調(diào)整
- 事務(wù)中使用try-catch確保正確處理錯誤
- 考慮使用ORM如Sequelize、TypeORM簡化復(fù)雜操作
8. 性能提示
- 對于高頻查詢,使用
execute()比query()更高效 - 批量操作考慮使用連接池的單個連接
- 長時間不用的連接池應(yīng)該調(diào)用
end()關(guān)閉
這些方法涵蓋了MySQL連接池的絕大多數(shù)使用場景,合理使用可以構(gòu)建高效可靠的數(shù)據(jù)庫應(yīng)用。
到此這篇關(guān)于MySQL連接池(Pool)常用方法詳解的文章就介紹到這了,更多相關(guān)MySQL連接池用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sql Server數(shù)據(jù)庫遠程連接訪問設(shè)置詳情
這篇文章主要介紹了Sql Server數(shù)據(jù)庫遠程連接訪問設(shè)置詳情,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
MySQL 字符串截取相關(guān)函數(shù)小結(jié)
本文是腳本之家小編給大家收藏整理的關(guān)于MySQL 字符串截取相關(guān)函數(shù)小結(jié),非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-04-04
IDEA 鏈接Mysql數(shù)據(jù)庫并執(zhí)行查詢操作的完整代碼
這篇文章主要介紹了IDEA 鏈接Mysql數(shù)據(jù)庫并執(zhí)行查詢操作的完整代碼,代碼不難,詳細大家看完本文肯定有意向不到的收獲,感興趣的朋友跟隨小編一起看看吧2021-05-05
MySQL授權(quán)用戶訪問數(shù)據(jù)操作方式
用戶授權(quán)操作可以控制數(shù)據(jù)庫用戶對數(shù)據(jù)庫對象的訪問權(quán)限,本文就來介紹MySQL授權(quán)用戶訪問數(shù)據(jù)操作方式,感興趣的可以了解一下2023-10-10
解決Navicat for Mysql連接報錯1251的問題(連接失敗)
記得在之前給大家介紹過Navicat for Mysql連接報錯的問題,可能寫的不夠詳細,今天在稍作修改補充下,對Navicat for Mysql連接報錯1251問題感興趣的朋友跟隨小編一起看看吧2021-05-05
淺談MySQL數(shù)據(jù)庫崩潰(crash)的常見原因和解決辦法
本文主要介紹了淺談MySQL數(shù)據(jù)庫崩潰(crash)的常見原因和解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

