2011-02-11 15 views
10

पर 'सुरक्षित' विकल्प का उपयोग करना चाहिए, मुझे प्रश्नों पर {सुरक्षित: सत्य} का उपयोग कब करना चाहिए?mongodb: क्या मुझे हमेशा mongodb से निपटने के दौरान अद्यतन

अभी मैं यह जांचने के लिए 'सुरक्षित' विकल्प का उपयोग करता हूं कि मेरे प्रश्नों को सफलतापूर्वक डाला गया या अपडेट किया गया था या नहीं। हालांकि, मुझे लगता है कि यह मार सकता है।

क्या मुझे लगता है कि 99% समय, मेरे प्रश्न (मानते हैं कि वे सही तरीके से लिखे गए हैं) को डाला/अपडेट किया जाएगा, जांचने के बारे में चिंता करने की ज़रूरत नहीं है कि क्या उन्होंने सफलतापूर्वक इनपुट किया है?

विचार?

उत्तर

24

मान लें कि जब आप प्रश्न पूछते हैं तो वास्तव में आपको लिखने/आवेषण (आपके प्रश्न का शब्द मुझे यह सोचता है) तो लिखें कंसर्न (सुरक्षित, कोई नहीं, fsync, आदि) का उपयोग अधिक गति और कम सुरक्षा पाने के लिए किया जा सकता है यह स्वीकार्य है, और जब आवश्यक हो तो कम गति और अधिक सुरक्षा।

उदाहरण के तौर पर, एक काल्पनिक फेसबुक-शैली एप्लिकेशन "पसंद" के लिए एक असुरक्षित लेखन का उपयोग कर सकता है, जबकि यह पासवर्ड परिवर्तनों के लिए एक बहुत ही सुरक्षित लिखने का उपयोग करेगा। इसके पीछे तर्क यह है कि कई हज़ार "पसंद" होंगे- स्टाइल अपडेट एक सेकंड हो रहा है, और कोई फर्क नहीं पड़ता कि कोई खो गया है, जबकि पासवर्ड अपडेट नियमित रूप से कम होते हैं लेकिन यह आवश्यक है कि वे सफल हों।

इसलिए, अपनी गति और डेटा अखंडता आवश्यकताओं के आधार पर, आप जो कुछ भी कर रहे हैं, उसके लिए अपनी लिखित चिंता विकल्प को तैयार करने का प्रयास करें।

2

सुरक्षित केवल लिखने पर आवश्यक है, पढ़ता नहीं है। प्रश्न केवल पढ़े जाते हैं।

6

यहां एक और उपयोग का मामला है जहां असुरक्षित लिखने उपयुक्त विकल्प हैं: आप बहुत कम क्रम में बड़ी संख्या में लिखते हैं। इस मामले में आप कई लिख सकते हैं, और फिर अंतिम त्रुटि प्राप्त करने के लिए कॉल करें कि उनमें से कोई भी विफल रहा है या नहीं।

collection.setWriteConcern(WriteConcern.NORMAL) 
collection.getDB().resetError() 
List< 
for (Something data : importData) { 
    collection.insert(makeDBObject(data)) 
} 
collection.getDB().getLastError(WriteConcern.REPLICAS_SAFE).throwOnError() 

यदि यह ब्लॉक अपवाद के बिना सफल होता है, तो सभी डेटा सफलतापूर्वक डाला गया था। यदि कोई अपवाद था, तो एक या अधिक लेखन कार्य विफल हो गए, और आपको उन्हें पुनः प्रयास करने की आवश्यकता होगी (या एक अद्वितीय अनुक्रमणिका उल्लंघन आदि की जांच करें)। वास्तविक जीवन में, आप कई अनुरोधों को पुनः सबमिट करने से बचने के लिए, हर 10 लिखने या तो, GetLastError को कॉल कर सकते हैं।

यह पैटर्न बड़ी मात्रा में डेटा के थोक आवेषण करते समय प्रदर्शन के लिए बहुत अच्छा है।

+0

चूंकि त्रुटियों को असीमित रूप से वापस आना चाहिए, आप कैसे जानते हैं कि आपने किसी भी त्रुटि के लिए काफी देर तक इंतजार किया है? – Leopd

+0

लिपड: त्रुटियां असीमित रूप से वापस नहीं आ रही हैं। GetLastError कॉल ब्लॉक जब तक कोई जवाब प्राप्त नहीं होता है। –

+0

लेकिन लिखने को असीमित रूप से किया जा रहा है। तो जब तक GetLastError लिखने वाले बफर को फ़्लश नहीं करता है, तो यह केवल त्रुटियों की रिपोर्ट करेगा जो हुआ है, और उन लेखनों के बारे में नहीं पता जो अभी तक समाप्त नहीं हुए हैं। – Leopd