创建和使用MongoDB连接池
发布于 8个月前 作者 tulayang 1668 次浏览

[ 使用node-mongodb-native驱动 ]

连接模块mongo.js

var mongodb = require('mongodb'),
    // 数据库连接缓存
    cache = {};

function connect (url, options) {
    var fns = [], status = 0, _db = cache[url];
    return function (f) {
        var args = arguments;
        if (_db !== null && typeof _db === 'object') {
            f.call(null, _db);
            return;
        }   
        fns.push(f);
        // 当有一个连接初始化请求时,挂起其他初始化请求
        // 连接池建立完后,使用该连接处理挂起的请求
        if (status === 0) {
            status = 1;
            mongodb.MongoClient.connect(url, options, function (err, db) {
                if (err) { throw err; }
                _db = cache[url] = db;
                for (var i = 0, len = fns.length; i < len; i++) {
                    fns.shift().call(null, _db);
                }
            });
        }
    };
}

module.connect = connect;

数据库连接配置文件database.json

{
    "test" : {
        "url"     : "mongodb://root:123456[@127](/user/127).0.0.1:27017/test",
        "options" : {
            "server" : {
                "poolSize" : 10
            }
        }
    }
}

需要url, options,具体细节参看官方文档。

如何使用

var conf = require('./database.json');
var connect = require('mongo').connect(conf.test.url, conf.test.options);
connect(function (db) {
    // 获得db的引用,如果没有建立连接池,则建立,否则使用连接池的连接
});
connect(function (db) {
    // 获得db的引用,如果没有建立连接池,则建立,否则使用连接池的连接
});
...
13 回复

请教楼主,什么情景下需要连接池?

需要多并发的时候,或者任何想提升响应速度的时候。

node.js 不需要这玩意吧,

貌似不需要这些吧。 我觉得nodejs这个东西是高并发没错,但是后面用的数据库等小兄弟就没那么牛X了。 不限制nodejs并发,我觉得会拖死数据库的。 我也是初学,说错了望见谅

任何数据库远程连接,都需要内存池保存连接,tcp慢启动和握手信号确认是很占用时间的。 至于数据库,NoSql是面向互联网非常好的解决方案。

nodejs服务器 <-------> mongodb服务器
请求连接 --------------- 
--------------- 收到请求
--------------- 同意连接
收到响应 ---------------
建立连接 ---------------
传送数据 ---------------

如果你想每次都这么费劲,可以不用内存池。

@tulayang mongodb是不是自带这些东西?

@hanzel21cn mongodb自带mongodb服务器端的连接池管理,你需要写nodejs端的

@tulayang 能否给个例子看看呢?具体的没写过

@hanzel21cn @tulayang mongoose自帶連接池和ODM 我覺得挺好 比直接用mongodb省事。。。

@jiangzhuo 嗯,我就是直接用的mongoose,不过面对大循环操作数据库,还是跟不上,一样会内存暴涨溢出

@hanzel21cn mongodb.MongoClient.connect(url, options, f)的时候,会跟mongodb服务器建立连接,并用options配置来设置mongodb服务器和nodejs的连接数。你只需要缓存回调函数f返回的db对象就可以了。

NodeJS是IO异步的……全站一个连接就够了……

回到顶部