1

node/expressサンプル MongoDB コレクション内に保存されている 2 つのドキュメントを取得する必要がある単純なアプリがあります(32-bit, localhost, Windows)native driverまたはのいずれかを使用できますMongoose 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)

これは大きな違いであり、明らかに、ネイティブ ドライバーを使用しているときに何かひどく間違ったことをしているのです。両方のアプローチのコードと、DB に格納されているデータを次に示します。

DB に保存されているドキュメントは 2 つだけです。

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

ネイティブ 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 );

出力: によって行われた 3300 の要求のうち 330 のみを完了してから 1 分後にタイムアウトしましたab


マングースの使用:

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数秒で完了。

ネイティブドライバーで私が間違っていることを理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

17

問題は、ネイティブ バージョンではリクエストごとに新しい接続プールが開かれることです。MongoClient.connectと のmongoose.connect呼び出しが起動時に 1 回だけ行われるようにコードを修正します。

于 2013-03-10T21:48:33.447 に答える