首页 文章

Nodejs群集与MySQL连接

提问于
浏览
3

看看关于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 回答

  • 2

    经过一些试验和错误,我使用选项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);
                    }
    
                });
            }
        });
    }
    
  • 0

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

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

相关问题