关于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);
});
节点集群选项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);
});
}
答案 0 :(得分:0)
我相信正确的答案是,这一切都取决于?如果您运行并发操作(异步等),您可能需要一个池。但是,如果您只是嵌套查询,那么单个共享连接应该没问题。
我更喜欢使用池(甚至是内部工作者),只是因为你获得了一些错误处理和免费的健壮性(连接在它们死亡时重新创建,有一个带有超时的操作队列等)。到目前为止,我没有发现任何缺点......
答案 1 :(得分:0)
将为每个工作线程重新创建该池,并且群集应用程序中将有多个连接池