2013-01-24 11 views
40

は、次の点を考慮Node.jsのコードです:Node.jsコードのどこにでもMongoDB接続を閉じないことをお勧めします。

function My_function1(_params) { 
    db.once('open', function (err){ 
    //Do some task 1 
}); 
} 

function My_function2(_params) { 
    db.once('open', function (err){ 
    //Do some task 2 
}); 
} 

は、私は、ログファイルを見てきたすべての接続

https://groups.google.com/forum/#!topic/node-mongodb-native/5cPt84TUsVg

を閉じることではないと言うのベストプラクティスのリンクを参照してくださいデータを以下の含まれています。

Fri Jan 18 11:00:03 Trying to start Windows service 'MongoDB' 
Fri Jan 18 11:00:03 Service running 
Fri Jan 18 11:00:03 [initandlisten] MongoDB starting : pid=1592 port=27017 dbpath=\data\db\ 64-bit host=AMOL-KULKARNI 
Fri Jan 18 11:00:03 [initandlisten] db version v2.2.1, pdfile version 4.5 
Fri Jan 18 11:00:03 [initandlisten] git version: d6...e0685521b8bc7b98fd1fab8cfeb5ae 
Fri Jan 18 11:00:03 [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49 
Fri Jan 18 11:00:03 [initandlisten] options: { config: "c:\mongodb\mongod.cfg", logpath: "c:\mongodb\log\mongo.log", service: true } 
Fri Jan 18 11:00:03 [initandlisten] journal dir=/data/db/journal 
Fri Jan 18 11:00:03 [initandlisten] recover begin 
Fri Jan 18 11:00:04 [initandlisten] recover lsn: 6624179 
Fri Jan 18 11:00:04 [initandlisten] recover /data/db/journal/j._0 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:59343 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:118828 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:238138 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:835658 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:955218 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3467218 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3526418 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3646154 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3705844 < lsn:6624179 
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section more... 
Fri Jan 18 11:00:05 [initandlisten] recover cleaning up 
Fri Jan 18 11:00:05 [initandlisten] removeJournalFiles 
Fri Jan 18 11:00:05 [initandlisten] recover done 
Fri Jan 18 11:00:10 [initandlisten] query MYDB.system.namespaces query: { options.temp: { $in: [ true, 1 ] } } ntoreturn:0 ntoskip:0 nscanned:5 keyUpdates:0 nreturned:0 reslen:20 577ms 
Fri Jan 18 11:00:10 [initandlisten] waiting for connections on port 27017 
Fri Jan 18 11:00:10 [websvr] admin web console waiting for connections on port 28017 
Fri Jan 18 11:01:10 [PeriodicTask::Runner] task: WriteBackManager::cleaner took: 32ms 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50076 #1 (1 connection now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50077 #2 (2 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50078 #3 (3 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50079 #4 (4 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50080 #5 (5 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50081 #6 (6 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50082 #7 (7 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50083 #8 (8 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50084 #9 (9 connections now open) 
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50085 #10 (10 connections now open) 
........................................... 
Fri Jan 18 13:36:48 [initandlisten] connection accepted from 192.168.0.1:50092 #97 (97 connections now open) 

これは、複数の接続を開いてクローズしないそれは内部的に接続プーリングを処理していますか?

しかしMongoDB Docsで、それは誰かがこれを理解する私を助けることができる

を「これはリクエスト・プーリングを使用しないアプリケーションの正常な動作です」言及されています。

+0

このリンクでも、「1つ以上の接続を開いたままにして、コード内で再利用してください」と表示されます。 (最後のコメントで)https://github.com/mongodb/node-mongodb-native/issues/84 –

答えて

36

MongoClientでDb接続を1回開いて、アプリケーション全体で再利用します。複数のデータベースを使用する必要がある場合は、Dbオブジェクトの.db関数を使用して、同じ基本接続プールを使用して別のデータベースで作業します。単一のブロッキング操作でnode.jsアプリケーションをフリーズできないように、プールが保持されます。プール内の5つの接続の場合のデフォルトサイズ。

http://mongodb.github.com/node-mongodb-native/driver-articles/mongoclient.html

私はまた、追加するのを忘れ。もう1つの答えは新しいTCP接続を設定することが時間的にもメモリ的にも費用がかかり、接続を再利用する理由です。また、新しい接続によって、Db上のメモリを使用してMongoDB上に新しいスレッドが作成されます。

+0

私はmongoに毎回再接続していたcronタスクを作成しました。いくつかのものをアーカイブするのは速い作業です。毎回タスクを再接続すると〜15〜25msかかりました。接続を再使用すると、約0-1msかかる。実際の世界の違いです:接続を再利用しながら速度が15〜25倍向上します。もちろん、25ミリ秒で十分だと言う人もいますが、シンプルなタスクでもリソースを増やすのはなぜですか?ちょうど接続を再利用する。完了しました。 –

5

私はnode.jsのエキスパートですが、理由はほとんどの言語では同じだと思います。

接続を作ることです:ドライバーが行う最もヘビー級のものの

1。高速ネットワークであっても、接続を正しく設定するには数百ミリ秒かかることがあります。

http://php.net/manual/en/mongo.connecting.pools.php

PHPのためのものであり、ドキュメントは、ドライバ部分はまだすべてではないが、今でもほとんどの間で適用される、その日のうち少しであることを条件とします。

各接続では、明らかなオーバーヘッドを引き起こす別のスレッドを使用することもできます。 Node.jsの

http://mongodb.github.com/node-mongodb-native/driver-articles/mongoclient.html#the-url-connection-format

はまだ試してみて、接続を行うのオーバーヘッドを停止するには、接続プールを使用しています。

はそれからと思われます。これはもちろん、PHPのような他のドライバには当てはまりません。

は、それはあなたのデータベースサーバへの接続(デフォルトは5ある)のx量を開き、データが必要なので、これらのログ引き起こす可能性があり、この厄介なプロセスを回避古い接続再利用されると転送は自由な接続に働く:http://docs.mongodb.org/manual/faq/developers/#why-does-mongodb-log-so-many-connection-accepted-eventsをして、接続のオーバーヘッドが増加します。

3

MongoDBのプールのデータベース接続がより効率的にするので、あなたのアプリが完全に閉じたときにすべての接続をクローズするのに便利ですがmongodb.log

で開いて多くの接続を持つことは珍しいことではありません。このコードは、これを行うために最も優れています。

process.on('SIGINT', function() { 
    mongoose.connection.close(function() { 
    console.log('Mongoose disconnected on app termination'); 
    process.exit(0); 
    }); 
}); 
関連する問題