setFirstResult और setMaxResults का उपयोग करना आपके लिए एकमात्र विकल्प है जिसके बारे में मुझे जानकारी है।
परंपरागत रूप से स्क्रॉल करने योग्य परिणामसेट केवल क्लाइंट को आवश्यक आधार पर पंक्तियों को स्थानांतरित करेगा। दुर्भाग्य से MySQL कनेक्टर/जे वास्तव में इसे नकली बनाता है, यह पूरी क्वेरी को निष्पादित करता है और इसे क्लाइंट तक पहुंचाता है, इसलिए ड्राइवर के पास वास्तव में रैम में लोड किया गया पूरा परिणाम सेट होता है और यह आपको ड्रिप फीड करेगा (स्मृति समस्याओं से बाहर होने से प्रमाणित) . आपके पास सही विचार था, यह सिर्फ MySQL जावा ड्राइवर में कमियां हैं।
मुझे इसके आसपास जाने का कोई रास्ता नहीं मिला, इसलिए नियमित सेटफर्स्ट/अधिकतम विधियों का उपयोग करके बड़े हिस्से को लोड करने के साथ चला गया। बुरी खबर लाने के लिए खेद है।
बस एक स्टेटलेस सत्र का उपयोग करना सुनिश्चित करें ताकि कोई सत्र स्तर कैश या गंदा ट्रैकिंग आदि न हो।
संपादित करें:
जब तक आप MySQL J/कनेक्टर से बाहर नहीं निकल जाते, आपका अद्यतन 2 सबसे अच्छा है। हालांकि ऐसा कोई कारण नहीं है कि आप क्वेरी की सीमा नहीं बढ़ा सकते। बशर्ते आपके पास इंडेक्स को होल्ड करने के लिए पर्याप्त रैम हो, यह कुछ हद तक सस्ता ऑपरेशन होना चाहिए। मैं इसे थोड़ा संशोधित करता, और एक बार में एक बैच लेता, और अगले बैच को हथियाने के लिए उस बैच की उच्चतम आईडी का उपयोग करता।
नोट:यह तभी काम करेगा जब other_conditions समानता का उपयोग करें (किसी श्रेणी की शर्तों की अनुमति नहीं है) और अनुक्रमणिका का अंतिम स्तंभ id . के रूप में रखें .
select *
from person
where id > <max_id_of_last_batch> and <other_conditions>
order by id asc
limit <batch_size>