管理MongoServer類生命週期的最佳做法是什麼?我應該在每次請求結束時創建一個並關閉它,還是應該使用類似StructureMap的應用程序作爲單應用程序保存在應用程序的整個生命週期中?在ASP.Net MVC中管理MongoDB連接的正確方法是什麼?
任何幫助表示感謝。
管理MongoServer類生命週期的最佳做法是什麼?我應該在每次請求結束時創建一個並關閉它,還是應該使用類似StructureMap的應用程序作爲單應用程序保存在應用程序的整個生命週期中?在ASP.Net MVC中管理MongoDB連接的正確方法是什麼?
任何幫助表示感謝。
在the official documentation中指出,MongoServer
,MongoDatabase
和MongoCollection
是線程安全的,並且你應該爲每個連接到數據庫中創建一個單一的MongoServer
。
因此,MongoServer
,MongoDatabase
和MongoCollection
可以安全地配置爲單身。 MongoServer
甚至可以通過爲相繼的調用返回相同的MongoDatabase
實例來幫助實施此操作,並且MongoDatabase
將爲MongoCollection
執行同樣的操作。
I.e.您的MongoServer
實例可以安全地配置爲在您的IoC容器中擁有單身生活方式,並且您還可以爲MongoDatabase
甚至MongoCollection
設置注射。
我使用這種策略與溫莎自己 - 你可以看到我MongoInstaller
這裏:https://gist.github.com/2427676 - 它可以讓我的班先走一步,這樣做:
public class SomeClass
{
public SomeClass(MongoCollection<Person> people)
{ ... }
}
爲了有一個集合注入,很好,隨時可以使用。
注入它使用任何IOC容器(結構圖,溫莎等),並保持其生命週期爲每個請求的基礎上。
所以這意味着每個請求線程創建一個服務器實例。我假設驅動程序處理連接池。那是對的嗎? – Roman 2012-04-20 07:39:04
是的,'MongoServer'管理連接池,並不意味着一遍又一遍地實例化。有關更多信息,請參見http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driver(「您將爲每個連接的服務器創建此類的一個實例。服務器在後臺自動處理(連接池用於提高效率)。「) – mookid8000 2012-04-20 20:15:22
C#驅動程序自動管理與服務器的連接(它使用連接池)。當驅動程序自動連接時,無需調用server.Connect。不要調用server.Disconnect,因爲它會關閉連接池中的所有連接,並干擾高效的連接池。
就管理MongoServer實例的生命週期而言,您可以自由地將其存儲在靜態變量中,並在流程的整個生命週期中使用它(並且跨線程共享,這是線程安全的)。或者,您可以在需要獲取服務器實例時再次調用MongoServer.Create。只要您使用相同的連接字符串不斷調用MongoServer.Create,您將繼續獲取相同的MongoServer實例。
感謝您分享WindsorInstaller。代碼現在有點老了,我想知道你是否有新的mongodriver 2.0的更新版本?我試着將它升級自己,但我不知道是否有更好的辦法?' https://gist.github.com/kri5t/afcba8068badb62f5c9b – 2016-03-22 10:59:05