Nodejs群集与MySQL连接

时间:2014-06-21 06:54:18

标签: 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);
});

节点集群选项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 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

将为每个工作线程重新创建该池,并且群集应用程序中将有多个连接池