安裝驅(qū)動(dòng)
Node 連接 MySQL 首先需要安裝 MySQL 驅(qū)動(dòng)
npm install --save mysql
連接數(shù)據(jù)庫(kù)
連接數(shù)據(jù)庫(kù)的方式很簡(jiǎn)單
- 初始化配置伸头,獲得連接實(shí)例
- 調(diào)用實(shí)例的.connect()方法
- 查詢數(shù)據(jù)
- 關(guān)閉連接
代碼如下:
const mysql = require('mysql'); // mysql node driver
const mysqlConfig = require('../secret/mysql.config'); // mysql配置文件
const console = require('tracer').colorConsole(); // 增強(qiáng)console
// 初始化數(shù)據(jù)庫(kù)配置, mysql端口號(hào)默認(rèn)為3306
const connection = mysql.createConnection({
host: mysqlConfig.host,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database,
});
// 連接數(shù)據(jù)庫(kù)
connection.connect(function (err) {
if (err) {
console.error('error connecting: ', err);
}
console.debug('connected id is', connection.threadId);
});
connection.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
}
console.debug('results', results);
});
connection.end();
為了安全性考慮,這里講數(shù)據(jù)庫(kù)的用戶名和密碼信息保存在單另的一個(gè)js文件里经瓷,如下:
連接池
如果不想程序在查詢數(shù)據(jù)時(shí)卡死或等待過(guò)長(zhǎng)時(shí)間翠储,一般不推薦在node中開(kāi)啟一個(gè)連接后全部查詢都用這個(gè)鏈接并且不關(guān)閉绘雁,因?yàn)椋阍嚵司椭罏槭裁戳?/p>
連接池是必要的援所,因?yàn)橹挥靡粋€(gè)單連接操作數(shù)據(jù)庫(kù)會(huì)出現(xiàn)一些問(wèn)題庐舟,比如每次查詢都要建立連接然后再關(guān)閉?建立連接和斷開(kāi)連接會(huì)有性能開(kāi)銷的住拭,而且如果只有一個(gè)連接實(shí)例挪略,并發(fā)的時(shí)候就傻了
所以連接池是非常必要的
建立連接池
建立連接池很簡(jiǎn)單历帚,只需要將mysql.createConnection
方法改為mysql.createPool
方法即可,可以在初始化的時(shí)候加一個(gè)connectionLimit
參數(shù)(一次創(chuàng)建的最大連接數(shù)杠娱。 (默認(rèn)值:10))
const mysql = require('mysql'); // mysql node driver
const mysqlConfig = require('../secret/mysql.config'); // mysql配置文件
const console = require('tracer').colorConsole(); // 增強(qiáng)console
// 初始化數(shù)據(jù)庫(kù)配置,建立連接池 mysql端口號(hào)默認(rèn)為3306
const pool = mysql.createPool({
connectionLimit: 10, // 連接數(shù)量
host: mysqlConfig.host,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database,
});
// 直接使用 pool.query
pool.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
});
// 通過(guò) pool.getConnection 獲得鏈接
pool.getConnection(function (err, connection) {
if (err) {
console.error(err);
return;
}
connection.query('SELECT * FROM articles', function (err, results, fields) {
if (err) {
console.error(err);
return;
}
console.debug('results', results);
connection.release(); // 釋放該鏈接挽牢,把該鏈接放回池里供其他人使用
// connection.destroy(); // 如果要關(guān)閉連接并將其從池中刪除,請(qǐng)改用connection.destroy()摊求。該池將在下次需要時(shí)創(chuàng)建一個(gè)新的連接禽拔。
});
});
查詢的方式有兩種:
一種是簡(jiǎn)單的直接使用
pool.query
,這種方式的優(yōu)點(diǎn)是簡(jiǎn)單室叉,且可以自動(dòng)回收connection
另一種是使用
pool.getConnection
獲得特定的connection
睹栖,再進(jìn)行查詢
他們兩的主要區(qū)別是:
參考文章:node.js中mysql連接池的使用
pool.getConnection獲取到的connection在其回調(diào)函數(shù)中是一致的,可以保證系列查詢?cè)谕粋€(gè)connection上依次串行執(zhí)行茧痕;pool.query每次調(diào)用則可能在不同的connection上執(zhí)行查詢
直接用 pool.query 每次都隨機(jī)分配 connection野来。當(dāng)有些操作需要保證是同一 connection 的時(shí)候,就獨(dú)立使用 pool.getConnection吧
所以結(jié)論是凿渊,大部分時(shí)間用 pool.query 就行了梁只,當(dāng)有些操作需要保證是同一 connection 的時(shí)候,就獨(dú)立使用 pool.getConnection