私は最近、GitHub の C# ドライバーを使用して MongoDB で遊んでいます (驚くほど高速です)。私がテストしている小さなシングル スレッド コンソール アプリでは、すべてが正常に機能しています。シングル スレッドで 8 秒以内に 1,000,000 のドキュメント (はい、100 万) を追加できます。forループの範囲外で接続を使用した場合にのみ、このパフォーマンスが得られます。つまり、インサートごとに接続するのではなく、インサートごとに接続を開いたままにしています。明らかにそれはわざとです。
複数のスレッドでどのように機能するかを確認するために、ノッチを上げると思いました。複数の同時リクエストで Web サイトをシミュレートする必要があるため、これを行っています。私は 15 から 50 のスレッドをスピンアップしていますが、すべてのケースで合計 150,000 のドキュメントを挿入しています。スレッドを実行させて、挿入操作ごとに新しい接続を作成すると、パフォーマンスが低下します。
明らかに、接続を共有、ロック、またはプールする方法を見つける必要があります。そこに問題があります。MongoDB への接続に関するベスト プラクティスは何ですか? アプリの存続期間中、接続を開いたままにする必要がありますか (操作ごとに TCP 接続を開いたり閉じたりするのにかなりの待ち時間があります)。
MongoDB、特に基礎となる接続について、実世界または実稼働の経験がある人はいますか?
これは、挿入操作用にロックされた静的接続を使用した私のスレッド サンプルです。Web コンテキストでのパフォーマンスと信頼性を最大化する提案を提供してください!
private static Mongo _mongo;
private static void RunMongoThreaded()
{
_mongo = new Mongo();
_mongo.Connect();
var threadFinishEvents = new List<EventWaitHandle>();
for(var i = 0; i < 50; i++)
{
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var thread = new Thread(delegate()
{
RunMongoThread();
threadFinish.Set();
});
thread.Start();
}
WaitHandle.WaitAll(threadFinishEvents.ToArray());
_mongo.Disconnect();
}
private static void RunMongoThread()
{
for (var i = 0; i < 3000; i++)
{
var db = _mongo.getDB("Sample");
var collection = db.GetCollection("Users");
var user = GetUser(i);
var document = new Document();
document["FirstName"] = user.FirstName;
document["LastName"] = user.LastName;
lock (_mongo) // Lock the connection - not ideal for threading, but safe and seemingly fast
{
collection.Insert(document);
}
}
}