Nodejs集群与MySQL连接

6

我需要翻译一些关于it技术的内容,具体是有关Nodejs集群和连接mysql服务器的方法。我们是为每个子进程开启一个连接,还是所有进程都共享一个连接?又或者我们应该为所有子进程创建连接池?哪种方法更可靠?

只有一个Node进程。

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

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

Hong,请您再发布一遍这个问题,以便能够获得更多的活动吗? - NiCk Newman
你好NiCK,你正在寻找解决方案吗? - Hong Zhou
我认为是这样。不确定是否将它们添加到集群或主节点中。 - NiCk Newman
嘿@NiCkNewman,看看我的答案。我一直在使用这个模式,似乎还不错。 - Hong Zhou
3个回答

3
经过一些尝试,我正在使用选项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);
                }

            });
        }
    });
}

1

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


0

我认为正确的答案是,这完全取决于情况?如果您运行并发操作(异步等),则可能需要使用池。但是,如果您只是嵌套查询,则单个共享连接应该足够。

我更喜欢使用池(即使在工作程序中),因为您可以免费获得一些错误处理和鲁棒性(连接在死亡时重新创建,有带有超时的操作队列等)。到目前为止,我还没有发现任何缺点...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接