8

MongoDB/Norm/ASP.NET MVC 3でサイトを構築し始めたばかりです。MongoDB/NoSQLのサイトを構築し始めたところです。Mongoデータベースへの接続をどのようにすべきか疑問に思っています。 。MongoDB接続をいつ開く必要がありますか?

今私は、MongoSessionをinstanciaseとonActionExecuted私はすべての私のMongoSessionへのアクセスを持っている私の派生コントローラがそれを処分するBasecontrollerがあります。 MongoSessionクラスはコンストラクタで接続を開き、それがDispose()に配置されます。これは、現在動作しています。

private IMongo _mongo; 

public MongoSession() 
{   
    _mongo = Mongo.Create("connString");  
} 

public void Dispose() 
{ 
    _mongo.Dispose(); 
} 

私はコントローラで他のものも同様にやっていると接続が長すぎると心配です。

あまりにも多くの接続を開いておく危険性がないか、以下の例のような方法をとっていますか?

はノーム「高価な」操作でのMongoDBの接続を開閉されています

public void Add<T>(T item) where T : class, new() 
    { 
     using (var mongo = Mongo.Create("connString")) 
     { 
     mongo.GetCollection<T>().Insert(item); 
     } 
    } 

もう一つ質問があるのフォローアップ?

+0

ノームはほとんど、もはや維持されていません。 –

+0

コードの接続の開閉に関するこの質問のほかに、インターネットプロバイダが接続を閉じて、EndOfStreamExceptionを持つコードに問題がありました。私はsettings.MaxConnectionIdleTime = TimeSpan.FromSeconds(30)を使って解決しました。 https://stackoverflow.com/a/44606284/194717 – Tony

答えて

8

接続を再作成するとコストがかかるため、接続を開いたままにしておきます。モンゴーは結構長い間オープンしています。理想的には、永続的な接続としてアプリケーションのすべての部分との接続を共有することです。内部的には接続を再利用する「接続プール」を使用するので、C#ドライバはこれを行うには十分に賢明でなければなりません。 「サーバーへの接続は自動的に処理されます(接続プールは効率を高めるために使用されます)。

歓声、 Derick

+1

合意。実際、MongoSessionクラスを書く必要はまったくありません。アプリケーションスコープ内にMongoServerインスタンスを格納するのが適切です。このインスタンスのDisconnect()は、MVCアプリケーションが終了した時点で一度だけ呼び出す必要があります。 –

+0

@Sean接続を閉じるタイミングについてのヒントをありがとう。 –

2

あなたは、C#のドライバが効率的にサーバーへの接続を使用する接続プールを併設しています接続または切断

を呼び出す必要はありません。接続または切断を呼び出す必要はありません。ドライバが接続を処理するようにしてください(Connectの呼び出しは無害ですが、Disconnectの呼び出しは接続プール内のすべての接続を閉じるため悪いです)。あなたはLINQのサポートは、その上にFluentMongoと公式のmongoドライバーと一緒に行きたい場合は

http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/

+0

リンク(今)には何も言及されていませんが、それは他のいくつかの親ページです。 – danio

関連する問題