2012-04-02 6 views
6

"केवल एक बार परिणाम प्रति बुलाया जाना चाहिए", यह कहते हैं:getResultSet() <code>java.sql.Statement</code> में <code>getResultSet</code> के लिए <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/Statement.html" rel="nofollow noreferrer">documentation</a> के अनुसार

एक ResultSet वस्तु के रूप में वर्तमान परिणाम पुन: प्राप्त करता। इस विधि को प्रति परिणाम केवल एक बार बुलाया जाना चाहिए।

कुछ परीक्षण कोड का उपयोग करना, मैं getResultSet() को executeQuery() और कई कॉल भाग गया और कहा कि ResultSet लौटे एक ही वस्तु की ओर इशारा किया। तो मुझे लगता है कि यह एक अलग ResultSet वापस नहीं कर रहा है जिसे आपको व्यक्तिगत रूप से बंद करने की आवश्यकता होगी। लेकिन निश्चित रूप से यह मेरे जेडीबीसी ड्राइवरों के लिए अद्वितीय हो सकता है।

ResultSet के लिए documentation को देखते हुए यह कहते हैं:

एक डिफ़ॉल्ट ResultSet वस्तु updatable नहीं है और एक कर्सर कि चाल आगे केवल है। इस प्रकार, आप केवल पहली पंक्ति से केवल अंतिम पंक्ति तक केवल एक बार और के माध्यम से इसे फिर से चला सकते हैं।

यह एक अच्छा कारण प्रतीत होता है कि इसे कई बार कॉल करने का अच्छा विचार क्यों नहीं हो सकता क्योंकि इससे कुछ "गॉचा" स्थिति हो सकती है। अगर यह एकमात्र कारण था, तो मुझे लगा कि वे सिर्फ इतना कह सकते थे कि इसलिए मुझे लगता है कि इससे कहीं अधिक हो सकता है।

तो क्या किसी को पता है कि किसी को प्रति परिणाम एक से अधिक बार getResultSet क्यों नहीं कॉल करना चाहिए? यह question है जो मुझे पहले स्थान पर उत्सुक बना देता है।

+1

इसे उत्तर के रूप में पोस्ट नहीं करना क्योंकि यह केवल एक झटका है, लेकिन मुझे संदेह है कि यह जेडीबीसी चालक डेवलपर्स को कुछ छूट देने का तरीका है, जिससे उन्हें परिभाषित नहीं किया जाता है कि जब आप इसे एक से अधिक बार कॉल करते हैं तो क्या होता है। आपके विशेष मामले में यह काम करता है, लेकिन यदि आपने कभी जेडीबीसी ड्राइवरों को स्विच किया है तो शायद यह नहीं हो सकता है। –

+1

मुझे लगता है कि यह उतना आसान है जितना: परिणामसेट ऑब्जेक्ट में राज्य है। वक्तव्य के सदस्य के रूप में केवल एक परिणामसेट वस्तु है। ऑब्जेक्ट प्राप्त करना कथन को फिर से निष्पादित नहीं करता है। ऑब्जेक्ट को दूसरी बार प्राप्त करना उसी स्थिति में होने की गारंटी नहीं है क्योंकि पहले प्राप्त होने के बाद आपने कुछ संशोधित किया है। तो यह सिर्फ एक सावधानी है। पोस्ट्रेस jdbc ड्राइवर (org.postgresql.jdbc2.AbstractJdbc2Statement) में देख रहे हैं, हम देख सकते हैं कि आंतरिक रूप से यह इस तरह की कई कॉल करता है: वापसी (परिणाम! = Null && result.getResultSet()! = Null); – Glenn

उत्तर

4

ResultSet ऑब्जेक्ट जावा जेडीबीसी द्वारा प्रदान किया गया एक इंटरफ़ेस है - वे कार्यान्वयन प्रदान नहीं करते हैं। भले ही आपका विशेष डेटाबेस कोड और संबंधित ड्राइवर ResultSet लागू करते हैं ताकि आप प्रति परिणाम कई बार कॉल कर सकें, यदि आप अनुबंध के बाहर ऐसे व्यवहार पर निर्भर करते हैं, तो आप निश्चित रूप से आग से खेल रहे हैं।

this method should be called only once per result लाइन के साथ अनुबंध लिखा गया एक संभावित कारण दक्षता कारणों से है। परिणामसेट का निर्माण करना संभवतः डेटाबेस में जेडीबीसी आरपीसी कॉल करेगा और जेडीबीसी विनिर्देश के लेखक कई राउंड ट्रिप को हतोत्साहित करना चाहते थे। हो सकता है कि वे लागूकर्ताओं को प्रति परिणाम एकाधिक कॉल के खिलाफ सुरक्षा के लिए मजबूर नहीं करना चाहते थे। फिर भी, भले ही आपका डेटाबेस उस व्यवहार के खिलाफ सुरक्षा कर रहा है, इसका मतलब यह नहीं है कि अगला वाला होगा।

अधिकांश ResultSet कार्यान्वयन डेटाबेस को खोलने के लिए एक कनेक्शन भी रखते हैं ताकि जब आप कुछ फ़ील्ड (जैसे बड़े ब्लब्स) प्राप्त करते हैं तो यह डेटा प्राप्त करने के लिए डेटाबेस पर वापस कॉल कर सकता है। एकाधिक ResultSet ऑब्जेक्ट्स से एक ही कनेक्शन का उपयोग करके कई कनेक्शन खुले या (खराब) होने से बहुत खतरनाक/भ्रमित हो जाएगा।

इसके अलावा, वे आपके कोड के दो हिस्सों को getResultSet() पर दो बार कॉल करने के बारे में चिंतित हो सकते थे और उन्हें एक ही एकल सिंक्रनाइज़ ऑब्जेक्ट का संदर्भ वापस कर दिया गया था। इससे भ्रम पैदा होगा जब next() को ऑब्जेक्ट को कई संदर्भों के साथ बुलाया गया था और ओवरराइट किया गया था।

मैं निश्चित रूप से अनुमान लगा रहा हूं लेकिन मुझे उम्मीद है कि इससे मदद मिलती है।

+0

निश्चित रूप से सहायक! अगर मुझे सही याद है, तो 'परिणामसेट' को बंद करने से किसी भी संभावित ब्लब्स को बंद नहीं किया जाता है। मैं एकाधिक कनेक्शन के संबंध में तीसरे अनुच्छेद के बारे में थोड़ा उलझन में हूं। डेटाबेस से किसी भी डेटा को पुनर्प्राप्त करने के लिए 'ResultSet' समान कनेक्शन 'का उपयोग नहीं करेगा? साथ ही, मैं अस्पष्ट हूं कि एकाधिक 'परिणामसेट' से वही 'कनेक्शन 'खराब क्यों है - मुझे यकीन है कि कुछ स्पष्ट है जो मैं देख रहा हूं। इसके अतिरिक्त, यदि आप एक उदाहरण प्रदान कर सकते हैं (भले ही यह एक विशिष्ट जेडीबीसी ड्राइवरों के लिए है) जहां 'getResult' को दो बार कॉल करना समस्याग्रस्त हो जाएगा, मुझे लगता है कि यह सही जवाब होगा। – nevets1219

+0

तीसरा पैराग्राफ दो, मैं बस इतना कह रहा हूं कि कनेक्शन प्रबंधन एक समस्या है। 'कनेक्शन' ऑब्जेक्ट की कई प्रतियां होने पर या यदि दो धागे प्रत्येक के पास 'परिणामसेट' था और उसी अनसंक्रनाइज़ 'कनेक्शन' पर संचालन कर रहा था तो यह खतरनाक होगा। – Gray

+0

उदाहरण प्रदान करने के मामले में, मेरे पास समय नहीं है। यह अनुबंध का उल्लंघन करने के बारे में है। पोस्टग्रेर्स अपने ड्राइवर को अपग्रेड कर सकते हैं और व्यवहार को थोड़ा बदल सकते हैं लेकिन फिर भी अनुबंध को पूरा कर सकते हैं और यदि आप काम करने के लिए कई कॉल पर निर्भर करते हैं तो आपका कोड टूट जाएगा। यह सिद्धांत का विषय है। – Gray