node-mysql 连接池

Posted

技术标签:

【中文标题】node-mysql 连接池【英文标题】:node-mysql connection pooling 【发布时间】:2011-10-07 13:19:59 【问题描述】:

我正在使用 node-mysql 模块 (https://github.com/felixge/node-mysql) 或 (http://utahjs.com/2010/09/22/nodejs-and-mysql-introduction/) 。

这个 API 也处理连接池吗?

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

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

我正在学习这个文档:https://github.com/felixge/node-mysql/blob/master/Readme.md

【问题讨论】:

【参考方案1】:

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

使用内置池的示例:

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

pool.getConnection(function(err, conn) 
  conn.query('select 1+1', function(err, res) 
    conn.release();
  );
);

2013 年之前的解决方案:

您可以使用node-pool 或mysql-pool 或使用您自己的简单循环池

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;

现在您可以希望在 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

【讨论】:

安德烈,您介意在此处更新您的(接受的)答案吗? node-mysql 现在支持池化。【参考方案2】:

我相信同一个 node-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);

阅读完整的案例研究(有和没有游泳池):http://codeforgeek.com/2015/01/nodejs-mysql-tutorial/

【讨论】:

如何在 carvendor.js 或 customers.js 等路由中重用!因为上面的代码仅用于概念证明而不是生产就绪的实现,其中在生产就绪的环境中没有人会在 app.js 文件中编写所有的功能 我从下面的stackurl ***.com/a/26552965/1333794处理场景 为什么在获取连接时出现错误会释放连接

以上是关于node-mysql 连接池的主要内容,如果未能解决你的问题,请参考以下文章

深入解析Node.js使用MySQL连接池

Node.js如何使用MySQL的连接池实例

node-mysql使用

连接池技术的连接池的建立

连接池的基本原理? 以及使用连接池的好处?

连接池