具有MySQL连接的Nodejs集群

查看关于Nodejs集群的build议以及连接到mysql服务器的方法。 我们是否为每个subprocess打开一个连接,或者为所有进程打开一个连接? 或者我们为所有的subprocess创build一个连接池? 哪个是推荐的方法?

一个节点进程

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); }); 

节点集群选项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); }); } 

选项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); }); } 

经过一些试验和错误,我使用选项2,它运作良好。 全局创build连接并在集群中使用。

每次需要查询时,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); } }); } }); } 

我相信正确的答案是,这一切都取决于? 如果你运行并发操作(asynchronous等),你可能会想要一个池。 但是,如果你只是嵌套查询,那么单个共享连接应该没问题。

我更喜欢使用池(甚至是内部工作者),只是因为你得到了一些免费的error handling和健壮性(连接在死亡时重新创build,有一个超时等操作队列)。 到目前为止,我还没有发现任何缺点