केवल फ़ेच आकार सेट करना सही तरीका नहीं है। विवरण#setFetchSize()
पहले से ही निम्नलिखित बताता है:
JDBC ड्राइवर को संकेत देता है डेटाबेस से प्राप्त की जाने वाली पंक्तियों की संख्या के अनुसार
ड्राइवर वास्तव में संकेत को लागू करने या अनदेखा करने के लिए स्वतंत्र है। कुछ ड्राइवर इसे अनदेखा करते हैं, कुछ ड्राइवर इसे सीधे लागू करते हैं, कुछ ड्राइवरों को अधिक मापदंडों की आवश्यकता होती है। MySQL JDBC ड्राइवर अंतिम श्रेणी में आता है। यदि आप MySQL JDBC ड्राइवर को चेक करते हैं दस्तावेज़ीकरण , आपको निम्न जानकारी दिखाई देगी (हेडर परिणाम सेट तक लगभग 2/3 नीचे स्क्रॉल करें ):
<ब्लॉकक्वॉट>इस कार्यक्षमता को सक्षम करने के लिए, आपको निम्नलिखित तरीके से एक स्टेटमेंट इंस्टेंस बनाना होगा:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
कृपया संपूर्ण पढ़ें दस्तावेज़ के अनुभाग में, यह इस दृष्टिकोण की चेतावनियों का भी वर्णन करता है। यहाँ एक प्रासंगिक उद्धरण है:
<ब्लॉकक्वॉट>इस दृष्टिकोण के साथ कुछ चेतावनी हैं। कनेक्शन पर कोई अन्य प्रश्न जारी करने से पहले आपको परिणाम सेट में सभी पंक्तियों को पढ़ना होगा (या इसे बंद करना होगा), या एक अपवाद फेंक दिया जाएगा।
(...)
यदि स्टेटमेंट लेन-देन के दायरे में है, तो लेन-देन पूरा होने पर ताले जारी किए जाते हैं (जिसका अर्थ है कि स्टेटमेंट को पहले पूरा करने की आवश्यकता है)। अधिकांश अन्य डेटाबेस की तरह, स्टेटमेंट तब तक पूरे नहीं होते हैं जब तक कि स्टेटमेंट पर लंबित सभी परिणाम पढ़े नहीं जाते हैं या स्टेटमेंट के लिए सक्रिय परिणाम सेट बंद नहीं होता है।
अगर वह OutOfMemoryError
को ठीक नहीं करता है (नहीं अपवाद
), तो समस्या यह हो सकती है कि आप तुरंत को संसाधित करने के बजाय जावा की मेमोरी में सभी डेटा संग्रहीत कर रहे हैं जैसे ही डेटा आता है। इसके लिए आपके कोड में और बदलाव की आवश्यकता होगी, शायद एक पूर्ण पुनर्लेखन। मैंने इसी तरह के प्रश्न का उत्तर यहां ।