2012-04-20 87 views

回答

24

the official documentation中指出,MongoServerMongoDatabaseMongoCollection是線程安全的,並且你應該爲每個連接到數據庫中創建一個單一的MongoServer

因此,MongoServer,MongoDatabaseMongoCollection可以安全地配置爲單身。 MongoServer甚至可以通過爲相繼的調用返回相同的MongoDatabase實例來幫助實施此操作,並且MongoDatabase將爲MongoCollection執行同樣的操作。

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 – 2016-03-22 10:59:05

2

注入它使用任何IOC容器(結構圖,溫莎等),並保持其生命週期爲每個請求的基礎上。

+0

所以這意味着每個請求線程創建一個服務器實例。我假設驅動程序處理連接池。那是對的嗎? – Roman 2012-04-20 07:39:04

+1

是的,'MongoServer'管理連接池,並不意味着一遍又一遍地實例化。有關更多信息,請參見http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driver(「您將爲每個連接的服務器創建此類的一個實例。服務器在後臺自動處理(連接池用於提高效率)。「) – mookid8000 2012-04-20 20:15:22

7

C#驅動程序自動管理與服務器的連接(它使用連接池)。當驅動程序自動連接時,無需調用server.Connect。不要調用server.Disconnect,因爲它會關閉連接池中的所有連接,並干擾高效的連接池。

就管理MongoServer實例的生命週期而言,您可以自由地將其存儲在靜態變量中,並在流程的整個生命週期中使用它(並且跨線程共享,這是線程安全的)。或者,您可以在需要獲取服務器實例時再次調用MongoServer.Create。只要您使用相同的連接字符串不斷調用MongoServer.Create,您將繼續獲取相同的MongoServer實例。

相關問題