与Mongoose相比,MongoDB原生Node.js驱动程序的性能糟糕,我做错了什么?

时间:2013-03-10 19:01:37

标签: node.js mongodb mongoose

我有一个简单的node/express应用,需要将2个文档存储在示例MongoDB集合(32-bit, localhost, Windows)中。我可以使用native driverMongoose ORM

与本机驱动程序一起拆开我的应用程序。 ApacheBench(3300请求,一次5个),整个事情超时......

Completed 330 requests
apr_pollset_poll: The timeout specified has expired (70007)

通过Mongoose访问时,相同的MongoDB集合只是通过比较飞过任务......

...
Completed 2970 requests
Completed 3300 requests
Finished 3300 requests
...
Requests per second:    244.49 [#/sec] (mean)
Time per request:       61.353 [ms] (mean)

这是大量的差异,显然我在使用本机驱动程序时做了一些非常错误的事情。以下是这些方法的代码以及存储在数据库中的数据。

只有两个文档存储在数据库中:

{
    "_id": "51bmdft4a487e771411ce8ef",
    "name": "Gintoki",
    "email": "sakata@yorozuya.com",
    "friends": [ "Shinpachi", "Kagura", "Tsukuyo" ]
},
{
    "_id": "51388p50bed4dghy4308745d",
    "name": "Elizabeth",
    "email": "eli@ossan.io",
    "friends": [ "Katsura" ]
}

使用Native MongoDB驱动程序:

var 
    app         = require( 'express' )(),
    MongoClient = require( 'mongodb' ).MongoClient,
    DB_URL      = 'mongodb://localhost:27017/testDB';

app.get( '/mongotest', function ( req, res ) {

    MongoClient.connect( DB_URL, function ( err, db ) {
        if( !err ) {
            var collection = db.collection( 'People' );
            collection.find().toArray(function(err, items) {
                res.send( JSON.stringify( items ) );
            })
        }
    })
})

app.listen( 5000 );

输出:一分钟超时,仅完成ab

提出的3300个请求中的330个

使用Mongoose:

var 
    app         = require( 'express' )(),
    mongoose    = require( 'mongoose' ),
    DB_URL      = 'mongodb://localhost:27017/testDB';

app.get( '/mongotest', function ( req, res ) {

    mongoose.connect( DB_URL );

    var 
        PeopleSchema = mongoose.Schema({ name: String, email: String, friends: Array }),
        People = mongoose.model( 'People', PeopleSchema ),
        db = mongoose.connection;

    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback () {
        People.find({}, function ( err, item ) {
            res.send( item );
        })
    })
})

app.listen( 5000 );

输出:与本机驱动程序相比,速度极快。 ab在几秒钟内完成。

任何人帮我弄清楚我对本机驱动程序做错了什么?

1 个答案:

答案 0 :(得分:16)

非常确定问题是在本机版本中,每个请求都会打开一个新的连接池。修改代码,以便在启动期间只调用MongoClient.connectmongoose.connect次调用