2012-04-16 9 views
24

यह जांचने का सबसे अच्छा/तेज़ तरीका क्या है कि Google- ऐप-इंजन डेटास्टोर में कोई इकाई मौजूद है या नहीं? अभी के लिए मैं कुंजी को इकाई से प्राप्त करने की कोशिश कर रहा हूं और जांच रहा हूं कि प्राप्त() एक त्रुटि देता है या नहीं।जांच कर रहा है कि Google ऐप इंजन डेटास्टोर में इकाई मौजूद है या नहीं।

मुझे डेटास्टोर पर एक इकाई प्राप्त करने की प्रक्रिया नहीं पता है। क्या यह जांच केवल करने के लिए एक तेज तरीका है?

+0

कुंजी द्वारा एक इकाई प्राप्त करने से कोई त्रुटि कभी नहीं आएगी, यह कोई भी नहीं लौटाती है। – aschmid00

+5

जावा 'get' में इकाई को नहीं मिलने पर अपवाद फेंकता है: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService#get(com.google .appengine.api.datastore.Key) –

+0

ठीक है उसे नहीं पता था। – aschmid00

उत्तर

4

com.google.appengine.api को ऐप इंजन जीसीएस क्लाइंट के पक्ष में बहिष्कृत कर दिया गया है।

क्या आपने एक प्रश्न का उपयोग करने पर विचार किया है? डेटा स्टोर में मौजूद किसी इकाई से पता लगाने के लिए अनुमान और जांच एक स्केलेबल तरीका नहीं है।

https://developers.google.com/appengine/docs/java/datastore/queries

संपादित करें:

क्या के बारे में महत्वपूर्ण केवल-क्वेरी क्वेरी डेटासंग्रह कि स्थिति के एक निर्धारित सेट को पूरा से संस्थाओं को पुनः प्राप्त करने के लिए बनाया जा सकता है? केवल-केवल प्रश्न पूछे जाने वाले प्रश्नों से तेज़ी से चलते हैं जो पूर्ण संस्थाओं को वापस करते हैं। केवल चाबियाँ लौटने के लिए, Query.setKeysOnly() विधि का उपयोग करें।

new Query("Kind").addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, key).setKeysOnly(); 

स्रोत: [1]: http://groups.google.com/group/google-appengine-java/browse_thread/thread/b1d1bb69f0635d46/0e2ba938fad3a543?pli=1

+1

एक क्वेरी करने के लिए समय प्रतिक्रिया एक इकाई लाने के लिए बेहतर है? – Victor

+13

नहीं, क्वेरी हमेशा अधिक समय लेती है और अधिक लागत लेती है, इसलिए मुझे नहीं लगता कि यह सही जवाब है। –

+1

.setKeysOnly() फ़िल्टर के साथ एक क्वेरी के लिए लागत वास्तव में एक ही लागत के रूप में एक ही लागत है (दोनों लेखांकन और प्रभावी रनटाइम के मामले में, क्योंकि यह ज्यादातर नेटवर्क राउंडट्रिप समय द्वारा निर्धारित किया जाता है)। यह भी ध्यान रखें कि KEY_RESERVED_PROPERTY के लिए क्वेरी को विशेष तरीके से माना जाता है क्योंकि यह किसी अन्य विशेषता के लिए एक क्वेरी के रूप में एक अंतिम संगत इंडेक्स का उपयोग नहीं करता है, लेकिन इसके बजाय दृढ़ता से संगत है। यह इस उत्तर को पूरी तरह से मान्य बनाता है, हालांकि कुंजी को लाकर बचत केवल इस प्रकार की क्वेरी के लिए निर्दिष्ट नहीं है। – Ext3h

3

आप एक List<Key> केवल एक Key युक्त का उपयोग कर लाने सकता है, that method रिटर्न एक Map<Key, Entity> आप देख सकते हैं कि अगर यह एक वास्तविक मूल्य या null, उदाहरण के लिए शामिल हैं:

Entity e = datastoreService.get(Arrays.asList(key)).get(key); 

सामान्य रूप से मुझे लगता है कि get() कोपर आने वाले प्रयास/प्रयास में लपेटना आसान होगायदि EntityNotFoundException पकड़ा गया है।

+0

केवल (कुंजी) का उपयोग करके यह सर्वोत्तम क्यों है? – Victor

+0

यह सिर्फ मेरे लिए अधिक "सही" लगता है यदि आप केवल एक कुंजी के लिए लाने जा रहे हैं - लेकिन यह पूरी तरह से व्यक्तिगत वरीयता है, और आप तक। –

+0

मैं प्रतिक्रिया समय – Victor

6

जो आपने प्रस्तावित किया है वह वास्तव में यह जानने का सबसे तेज़ तरीका होगा कि आपकी इकाई मौजूद है या नहीं। आपको धीमा करने वाली एकमात्र चीज वह है जो आपकी इकाई को लाने और deserialize करने के लिए लेता है। यदि आपकी इकाई बड़ी है, तो यह आपको धीमा कर सकती है।

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

मुझे लगता है कि बेहतर तरीका है कि आप अपनी चाबियाँ डिज़ाइन करेंगे, जैसे कि आप जानते हैं कि डुप्लिकेट नहीं होंगे, या आपके ऑपरेशन बेवकूफ हैं, ताकि अगर पुरानी इकाई अधिलेखित हो, तो इससे कोई फर्क नहीं पड़ता।

+0

मुझे नहीं लगता कि इस प्रक्रिया से बचने का एक तरीका है जब कई प्रक्रियाएं समानांतर में चलती हैं। एक डुप्लिकेट सुनिश्चित करने का एकमात्र तरीका लेनदेन का उपयोग करना है: जांचें कि कोई इकाई पहले से मौजूद है या नहीं, अगर नहीं - तो एक नई इकाई बनाएं। –

+0

शायद आप मेरे उत्तर को समझ नहीं पाए। मैंने बहुत कुछ कहा, चीज। और फिर, मैंने उस मामले में एक अनुकूलन जोड़ा जहां आपके पास बड़ी संस्थाएं हैं और आप बड़ी इकाई को deserialize नहीं करना चाहते हैं। अस्तित्व की जांच करने के लिए आपके पास दूसरी छोटी इकाई हो सकती है ताकि यह बड़ी इकाई को लाने से ज्यादा तेज़ हो सके। लेकिन आप लिख रहे हैं, आपको लेनदेन में उन दो इकाइयों को लिखना होगा। – dragonx

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