MySQL連接池(Pool)常用方法詳解
MySQL 連接池 (Pool) 常用方法詳解
1. 創(chuàng)建連接池
首先需要?jiǎng)?chuàng)建連接池實(shí)例:
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 // 無(wú)限制的排隊(duì)請(qǐng)求 });
2. 核心方法
2.1 pool.query(sqlString, [values])
- 作用:執(zhí)行SQL查詢的最簡(jiǎn)單方法
- 特點(diǎn):
- 自動(dòng)獲取和釋放連接
- 支持參數(shù)化查詢
- 返回值:
[rows, fields]
- 示例:
const [rows] = await pool.query('SELECT * FROM users WHERE age > ?', [18]);
2.2 pool.execute(sqlString, [values])
- 作用:執(zhí)行預(yù)處理語(yǔ)句
- 特點(diǎn):
- 比
query()
更高效(特別是重復(fù)查詢) - 自動(dòng)創(chuàng)建和緩存預(yù)處理語(yǔ)句
- 比
- 返回值:
[rows, fields]
- 示例:
const [rows] = await pool.execute('SELECT * FROM products WHERE price > ?', [100]);
2.3 pool.getConnection()
- 作用:顯式獲取一個(gè)連接
- 使用場(chǎng)景:
- 需要執(zhí)行事務(wù)
- 需要執(zhí)行多個(gè)相關(guān)查詢
- 注意:必須手動(dòng)釋放連接
- 示例:
const connection = await pool.getConnection(); try { // 使用connection執(zhí)行查詢 } finally { connection.release(); // 必須釋放 }
3. 連接對(duì)象(Connection)方法
通過(guò)getConnection()
獲取的連接對(duì)象有以下方法:
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)用,否則會(huì)導(dǎo)致連接泄漏
4. 連接池管理方法
4.1 pool.end()
- 作用:優(yōu)雅關(guān)閉連接池
- 示例:
await pool.end(); // 關(guān)閉所有連接
4.2 pool.escape(value)
- 作用:手動(dòng)轉(zhuǎn)義值
- 示例:
const name = pool.escape(userInput); // 防止SQL注入
4.3 pool.escapeId(identifier)
- 作用:轉(zhuǎn)義標(biāo)識(shí)符(表名、列名)
- 示例:
const tableName = pool.escapeId('user table');
5. 事務(wù)處理完整示例
const connection = await pool.getConnection(); try { await connection.beginTransaction(); // 執(zhí)行多個(gè)操作 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)從池中獲取連接時(shí)觸發(fā)
pool.on('acquire', (connection) => { console.log('Connection %d acquired', connection.threadId); });
6.2 'release'
- 當(dāng)連接釋放回池中時(shí)觸發(fā)
pool.on('release', (connection) => { console.log('Connection %d released', connection.threadId); });
7. 最佳實(shí)踐
- 總是使用參數(shù)化查詢防止SQL注入
- 及時(shí)釋放連接避免連接泄漏
- 合理設(shè)置連接池大小根據(jù)應(yīng)用負(fù)載調(diào)整
- 事務(wù)中使用try-catch確保正確處理錯(cuò)誤
- 考慮使用ORM如Sequelize、TypeORM簡(jiǎn)化復(fù)雜操作
8. 性能提示
- 對(duì)于高頻查詢,使用
execute()
比query()
更高效 - 批量操作考慮使用連接池的單個(gè)連接
- 長(zhǎng)時(shí)間不用的連接池應(yīng)該調(diào)用
end()
關(guān)閉
這些方法涵蓋了MySQL連接池的絕大多數(shù)使用場(chǎng)景,合理使用可以構(gòu)建高效可靠的數(shù)據(jù)庫(kù)應(yīng)用。
到此這篇關(guān)于MySQL連接池(Pool)常用方法詳解的文章就介紹到這了,更多相關(guān)MySQL連接池用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 啟動(dòng)失敗(code=exited, status=1/FAILURE)異常解決方案
在MySQL服務(wù)啟動(dòng)時(shí)遇到啟動(dòng)失敗問(wèn)題,通過(guò)查看和分析錯(cuò)誤日志文件,找到并解決了配置文件中的錯(cuò)誤項(xiàng),成功重啟了MySQL服務(wù).文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11MySQL中常見(jiàn)關(guān)鍵字的用法總結(jié)
這篇文章主要為大家詳細(xì)介紹了MySQL中常見(jiàn)關(guān)鍵字的用法,例如GROUP BY、ORDER BY和LIMIT,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-09-09安裝mysql出錯(cuò)”A Windows service with the name MySQL already exis
這篇文章主要介紹了安裝mysql出錯(cuò)”A Windows service with the name MySQL already exists.“如何解決的相關(guān)資料,在日常項(xiàng)目中此問(wèn)題比較多見(jiàn),特此把解決辦法分享給大家,供大家參考2016-05-05My Sql 1067錯(cuò)誤與編碼問(wèn)題的解決方案
My Sql 大部分都是用綠色版(解壓版) 然后注冊(cè)服務(wù)簡(jiǎn)單方便,但是配置文件也很讓人糾結(jié),下面小編給大家?guī)?lái)了My Sql 1067錯(cuò)誤與編碼問(wèn)題的解決方案,感興趣的朋友參考下吧2016-11-11