节点mysql连接池

节点mysql连接池,mysql,database,node.js,connection-pooling,Mysql,Database,Node.js,Connection Pooling,我正在使用node mysql模块()或() 这个API也处理连接池吗 我的意思是,对于每个用户请求,我都会调用Client.connect()来查询MySQL并释放连接:Client.end() 这是正确的方法,还是我应该在代码中只连接/断开一次 我从本文档中了解到:更新:2013年2月-池支持已添加到节点mysql,请参阅 使用内置池的示例: var pool = require('mysql').createPool(opts); pool.getConnection(function(

我正在使用node mysql模块()或()

这个API也处理连接池吗

我的意思是,对于每个用户请求,我都会调用
Client.connect()
来查询MySQL并释放连接:
Client.end()

这是正确的方法,还是我应该在代码中只连接/断开一次


我从本文档中了解到:

更新:2013年2月-池支持已添加到节点mysql,请参阅

使用内置池的示例:

var pool = require('mysql').createPool(opts);

pool.getConnection(function(err, conn) {
  conn.query('select 1+1', function(err, res) {
    conn.release();
  });
});
2013年前的解决方案:

您可以使用或使用自己的简单循环池

function Pool(num_conns)
{
    this.pool = [];
    for(var i=0; i < num_conns; ++i)
        this.pool.push(createConnection()); // your new Client + auth
    this.last = 0;
}

Pool.prototype.get = function()
{
    var cli = this.pool[this.last];
    this.last++;
    if (this.last == this.pool.length) // cyclic increment
       this.last = 0;
    return cli;
}
功能池(连接数)
{
this.pool=[];
对于(变量i=0;i
现在,您可以希望在1秒内执行所有查询回调:

var p = new Pool(16);
for (var i=0; i < 10; ++i)
{
    p.get().query('select sleep(1)', function() { console.log('ready'); } ); // server blocks for 1 second
}
var p=新池(16);
对于(变量i=0;i<10;++i)
{
p、 get().query('select sleep(1'),function(){console.log('ready');});//服务器阻塞1秒
}

我相信同一个节点mysql包提供了连接池。看一看

var express   =    require("express");
var mysql     =    require('mysql');
var app       =    express();

var pool      =    mysql.createPool({
    connectionLimit : 100, //important
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'address_book',
    debug    :  false
});

function handle_database(req,res) {

    pool.getConnection(function(err,connection){
        if (err) {
          connection.release();
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        }   

        console.log('connected as id ' + connection.threadId);

        connection.query("select * from user",function(err,rows){
            connection.release();
            if(!err) {
                res.json(rows);
            }           
        });

        connection.on('error', function(err) {      
              res.json({"code" : 100, "status" : "Error in connection database"});
              return;     
        });
  });
}

app.get("/",function(req,res){-
        handle_database(req,res);
});

app.listen(3000);

阅读完整的案例研究(有池和无池):

Andrey,您是否介意在此处更新您(已接受)的答案。节点mysql现在支持池。如何在carvendor.js或customers.js等路由中重用!由于以上代码仅用于概念验证,而非生产准备实施,在生产准备环境中,没有人会在app.js文件中写入其所有功能。我从下面的stackurl处理了该场景。如果在获取连接时出现错误,为什么要释放连接