【问题标题】:node-mysql connection poolingnode-mysql 连接池
【发布时间】: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

【问题讨论】:

    标签: mysql database node.js connection-pooling


    【解决方案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-poolmysql-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 stackoverflow.com/a/26552965/1333794处理场景
    • 为什么在获取连接时出现错误会释放连接
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2013-09-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多