Hon*_*hou 5 mysql node.js node-mysql
正在寻找有关 Nodejs 集群和连接到 mysql 服务器的方法的建议。我们是为每个子进程打开一个连接还是只为所有进程打开一个连接?还是我们为所有子进程创建一个连接池?推荐的方法是什么?
单节点进程
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'example.org',
user : 'bob',
password : 'secret'
});
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
Run Code Online (Sandbox Code Playgroud)
节点集群选项 1:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// open one connection for each process
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'example.org',
user : 'bob',
password : 'secret'
});
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
}
Run Code Online (Sandbox Code Playgroud)
选项2:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret'
});
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// accept http connections and query
pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
}
Run Code Online (Sandbox Code Playgroud)
经过一番尝试和错误后,我使用了选项 2,效果很好。全局创建连接并在集群中使用。
每次需要查询时,getConnection。
pool.getConnection(function(err, connection) {
if(err) {
console.log('Error getting sql connection');
console.dir(err);
if(typeof connection !== "undefined")
connection.release();
callback(err);
}
if(typeof cb === "undefined") {
//console.log('with 2 params');
connection.query( sql, function(err, rows) {
connection.release();
console.dir(sql);
// console.dir('data=>' + data);
if(err) {
console.log('err:' + err);
callback(err, rows);
}else{
console.log( rows );
callback(err, rows);
}
});
} else {
// console.log('with 3 params:' + cb);
connection.query( sql, data, function(err, rows){
connection.release();
console.log(sql);
console.dir(data);
if(err) {
console.log('err:' + err);
callback(err, rows);
}else{
console.log( rows );
callback(err, rows);
}
});
}
});
}
Run Code Online (Sandbox Code Playgroud)