2012-12-19 25 views
8

n ऑब्जेक्ट के साथ ResultSet rs होने का मानना ​​है (rs.next())।जबकि rs.absolute()

इस कोड:

while(rs.next()) { 
    // do something on rs 
} 

algoritmically इस कोड के बराबर है (अर्थात दोनों एक ही परिणाम दे दी है):

for(i=1; i<=n; i++) { 
    rs.absolute(i) 
    // do something on rs 
} 

लेकिन throughouts की शर्तों पर इस equivalant कर रहे हैं? क्या पहला तेज़ है? या, किसी दिए गए i के लिए, rs.next() rs.absolute(i+1) के लिए सिर्फ एक रैपर है?

सादर एम सी

+1

आपको इसे स्वयं परीक्षण करने से क्या रोकता है? सबसे अधिक संभावना है कि अंतर नकारात्मक है, इसलिए पढ़ने के लिए आसान कोड का उपयोग किया जाना चाहिए। –

+1

@ KlasLindbäck एक सही माइक्रोबेंमार्क लिखना आश्चर्यजनक रूप से [nontrivial] है (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java)। –

+2

'rs.next() 'के साथ आपको' rs.absolute() 'के साथ पहले से परिणाम सेट आकार को जानने की आवश्यकता नहीं है। जिसका मतलब है कि पहले एक दूसरी क्वेरी है। – BalusC

उत्तर

6

rs.next डेटाबेस कर्सर (FORWARD_ONLY) rs.absolute से का एक सरल तरह तो ज्यादातर मामलों में आप rs.absolute साथ प्रदर्शन/संसाधन क्षमता नीचा होगा मांग करती है। कुछ मामलों में, जहां FORWARD_ONLY कर्सर के लिए कोई अनुकूलन नहीं है, वैसे भी, आपको वही प्रदर्शन मिल सकता है।

कुछ ड्राइवर absolute को FORWARD_ONLY के साथ भी कॉल कर सकते हैं, यह सत्यापित करते हुए कि अनुरोधित रिकॉर्ड अगला है, लेकिन फिर भी अन्य कोई अपवाद फेंक सकते हैं।

+0

तो अगर मैंने अपना तैयार स्टेमेंटमेंट तैयार करने के रूप में घोषित किया है (SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); कोड के दो ब्लॉक बिल्कुल बराबर हैं। सही? –

+0

इसका सामान्य में उत्तर नहीं दिया जा सकता है क्योंकि ये सभी ड्राइवर के लिए संकेत हैं। एक अंतर की वास्तविक संभावना कम है, लेकिन मुझे यकीन है कि काउंटररेक्समल्स भी हैं। –

+0

@Mariano इसकी पुष्टि करने का कोई तरीका नहीं है, क्योंकि यह चालक के कार्यान्वयन और अंतर्निहित डेटाबेस के व्यवहार पर दृढ़ता से निर्भर करेगा। आम तौर पर मैं कहूंगा: 'rs.next() 'का उपयोग करें, यदि आप अनुक्रमिक रूप से एक परिणामसेट के माध्यम से जाना चाहते हैं, लेकिन यह केवल एक आंत महसूस कर रहा है –

2

पूर्व rs.next() तेजी से हो सकता है, हालांकि यह अंतर्निहित कार्यान्वयन पर निर्भर करता है और वास्तविकता में आप आंतरिक अनुकूलन के कारण समान प्रदर्शन प्राप्त कर सकते हैं।

ड्राइवर rs.absolute() करते समय वर्तमान स्थिति को ध्यान में नहीं ले रहा है, इसलिए यह थोड़ा सा ओवरहेड हो सकता है, जबकि rs.next() में यह केवल आगे बढ़ रहा है।

तो यदि आपको सभी परिणामों के माध्यम से पुन: प्रयास करने की आवश्यकता है, तो का उपयोग करें, यदि आपको rs.absolute() का उपयोग करने के विशिष्ट परिणामों पर जाने की आवश्यकता है।

याद रखें कि परिणाम सेट वास्तव में डेटाबेस द्वारा दूरस्थ रूप से संभाला जा रहा है (जब तक कि यह CachedResultSet न हो), इसलिए आपके विचार से अधिक ओवरहेड शामिल हो सकते हैं।