मैं एक PostgreSQL क्वेरी जो एक बड़ी परिणाम देता है निष्पादित करने के लिए कोशिश कर रहा हूँ से बाहर दे:JDBC + बड़े PostgreSQL क्वेरी स्मृति
connection.setAutoCommit(false);
st = connection.createStatement(
ResultSet.CONCUR_READ_ONLY,
ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(100);
logMemory();
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query ");
logMemory();
लेकिन यह स्मृति का एक बहुत का उपयोग करता है:
Free memory; 4094347680 (= 3905 mb).
start query
done query
Free memory; 2051038576 (= 1956 mb).
(Runtime.getRuntime() के साथ मुद्रित। फ्रीमेमरी())
अब तक यह काम करता है लेकिन डेटाबेस बहुत बड़ा होगा। मुझे स्मृति में पूरे परिणाम की आवश्यकता नहीं है; मुझे बस प्रत्येक पंक्ति को खरीदने की आवश्यकता है, परिणाम डिस्क पर लिखें और अगली पंक्ति पर जाएं।
मुझे पता है कि 'setFetchSize' केवल एक संकेत है, लेकिन अगर मैं postgresql/jdbc इसे अनदेखा कर दूंगा, तो मुझे यह अजीब लगेगा, क्योंकि यह उम्र के आसपास है।
इस के आसपास पाने के लिए कोई भी तरीका है? मेरा एकमात्र विचार अब तक एक बैच स्क्रिप्ट बनाना है जो क्वेरी के परिणाम को डिस्क पर स्ट्रीम करता है और फिर जावा से फ़ाइल को पार्स करता है ...
बस उत्सुक है, आप जिस अधिकतम ढेर आकार के साथ चल रहे हैं? या आप डिफ़ॉल्ट का उपयोग कर रहे हैं? –
यह -Xmx4096M -Xms4096M है, यह विस्टा 8 जीबी मशीन है। – kresjer