2012-04-20 7 views
27

MongoServerクラスのライフサイクル管理のベストプラクティスは何ですか?私は1つを作成し、各要求の終わりにそれを閉じるか、それはStructureMapのようなものを使用して、アプリの生涯にわたってシングルトンとして保持する必要がありますか?ASP.Net MVCでMongoDB接続を管理する正しい方法は何ですか?

ご協力いただきありがとうございます。

答えて

24

the official documentationでは、MongoServerMongoDatabase、およびMongoCollectionはスレッドセーフで、あなたはあなたがに接続するデータベースごとに1つのMongoServerを作成することになっていることであると述べています。

したがって、MongoServer,MongoDatabaseおよびMongoCollectionは、安全にシングルトンに設定できます。 MongoServerは、同じコールを返すために同じMongoDatabaseインスタンスを返すことによってこれを強制するのに役立ちます。MongoDatabaseMongoCollectionに対して同じことを行います。

I.e. MongoServerインスタンスは、IoCコンテナにシングルトンのライフスタイルを持つように安全に設定することができます。また、MongoDatabase、さらにはMongoCollectionの注入を設定することもできます。

私はウィンザーで自分自身をこの戦略を使用している - あなたはここに私のMongoInstallerを見ることができます:https://gist.github.com/2427676 - それは私のクラスはちょうど先に行くとこれを行うことができます:

public class SomeClass 
{ 
    public SomeClass(MongoCollection<Person> people) 
    { ... } 
} 

注入されたコレクションを持っているために、素敵で使い易い。

+0

WindsorInstallerを共有していただきありがとうございます。コードはやや古いので、新しいmongodriver 2.0のアップデート版があるのだろうか?私はそれを自分でアップグレードしようとしましたが、より良い方法があるかどうかはわかりません? ' https://gist.github.com/kri5t/afcba8068badb62f5c9b –

2

IOCコンテナ(structuremap、Windsorなど)を使用して注入し、ライフタイムをリクエストごとに維持します。

+0

これは、リクエストごとにサーバーのインスタンスを作成することを意味します。ドライバが接続プールを処理すると仮定します。あれは正しいですか? – Roman

+1

はい、 'MongoServer'は接続プールを管理しており、何度も何度もインスタンス化するつもりはありません。詳細については、http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driverを参照してください(「接続する各サーバごとにこのクラスのインスタンスを1つ作成します。サーバーは自動的に処理されます(接続プールは効率を高めるために使用されます)。 ") – mookid8000

7

C#ドライバは、サーバーへの接続を自動的に管理します(接続プールを使用します)。ドライバが自動的に接続するので、server.Connectを呼び出す必要はありません。接続プール内のすべての接続を閉じ、効率的な接続プーリングを妨げるため、server.Disconnectを呼び出さないでください。

MongoServerインスタンスのライフサイクルを管理する限り、静的変数に保存してプロセスの存続期間(スレッド間で共有することはスレッドセーフです)に自由に使用できます。あるいは、サーバーインスタンスを取得する必要があるときはいつでもMongoServer.Createを再度呼び出すことができます。同じ接続文字列でMongoServer.Createを呼び出し続ける限り、同じMongoServerインスタンスを取得し続けるでしょう。

関連する問題