2013-06-16 9 views
11

MongoClient, MongoServer, MongoDatabase और MongoCollection<T> के लिए प्रलेखन में मुझे लगता है कि यह कहा गया है कि वे थ्रेड-सुरक्षित हैं।MongoDB सी # चालक और थ्रेड सुरक्षा

प्रश्न: क्या इसका मतलब है कि मेरे पास कक्षा में उनमें से स्थिर क्षेत्र (उदाहरण के लिए) हो सकते हैं और उन्हें Task/Thread से एक्सेस कर सकते हैं?

तरह:

public static MongoClient Client = new MongoClient(Properties.Settings.Default.MongoConnStr); 
public static MongoServer Server = Client.GetServer(); 
public static MongoDatabase DraftDB = Server.GetDatabase("draftdb"); 
public static MongoCollection<MyDoc> Docs = Program.DraftDB.GetCollection<Location>("mydocs"); 

MongoCollection<T> के बारे में विशेष रूप से; मैं यह सुनिश्चित करना चाहता हूं कि var cursor = Docs.Find(query).SetLimit(50); जैसे कुछ MongoCollection<T> पर एक उत्परिवर्तन नहीं करते हैं (यह स्थिर स्थिति सटीक है)।

+2

तो हाँ और नहीं। जबकि खेतों पर सामान्य संचालन अन्य धागे/कार्यों के लिए अपने "राज्य" को नहीं बदलेगा, तो आप गलती से अपने राज्य को बदलने से बचने के लिए निजी तरीकों से म्यूटेटिंग कार्यों को छिपाना (encapsulate) करना चाहते हैं (जैसे गलती से ओवरराइटिंग या उनके मूल्य को असाइन करना)। इस कोड पर एक नज़र डालें जो सी # ड्राइवर कोड यूनिट परीक्षण है: https://github.com/mongodb/mongo-csharp-driver/blob/296795e687d62dd97bd38204ccd026644fa76eae/MongoDB.DriverUnitTests/Configuration.cs –

+2

ध्यान दें कि MongoCursor क्लास * नहीं * थ्रेड सुरक्षित है, इसलिए आपका उदाहरण एक अच्छा है - एक कर्सर को संग्रह से वापस प्राप्त करना - यह संग्रह फ़ील्ड के लिए सुरक्षित है लेकिन कर्सर लौटाया गया है निश्चित रूप से थ्रेड सुरक्षित नहीं है और कार्यों के बीच साझा नहीं किया जाना चाहिए। –

+1

@AyayaKamsky धन्यवाद; लेकिन यहां 'मोंगो कर्सर' का उपयोग साझा संसाधन (सार्वजनिक सार्वजनिक क्षेत्र की तरह) के रूप में नहीं किया जाता है। लेकिन मुझे नहीं पता कि 'मोंगोकोलेक्शन ' थ्रेड सुरक्षित है, या नहीं, अभी तक, जुड़े हुए नमूने को देखकर। –

उत्तर

10

this page से आप जानते हैं कि मोंगोसेवर, मोंगोडाबेस, मोंगो क्लाइंट, मोंगोकोलेक्शन और मोंगोग्रीडएफएस सुरक्षित हैं। MongoCursor विशेष रूप से थ्रेड-सुरक्षित नहीं है।

इसका मतलब है कि आप अपने "राज्य" को बदलने के बारे में चिंता किए बिना उन्हें कई कार्यों से सुरक्षित रूप से एक्सेस कर सकते हैं - हालांकि आपको अभी भी अपने मूल्यों को सेट या बदलने के तरीके पर ध्यान रखना होगा।

विशेष रूप से आपके प्रश्न पर, एक संग्रह (जो एक कर्सर ऑब्जेक्ट देता है) पूछताछ करता है मोंगोकोलेक्शन ऑब्जेक्ट को म्यूटेट करता है।

संबंधित मुद्दे