2009-05-13 13 views
27

मेरे पास एक .jsp पृष्ठ है जहां मेरे पास एक GUI तालिका है जो ओरेकल डेटाबेस से रिकॉर्ड प्रदर्शित करती है। यह तालिका ठेठ अंकन व्यवहार, जैसे "FIRST", "अगला", "पिछला" और "अंतिम" की अनुमति देती है। रिकॉर्ड Java ResultSet ऑब्जेक्ट से प्राप्त किए जाते हैं जो SQL कथन निष्पादित करने से वापस लौटाया जाता है।क्या कोई परिणामसेट डेटा को स्मृति में या केवल अनुरोध करते समय लोड करता है?

यह ResultSet, बहुत बड़ा हो सकता है तो मेरे सवाल यह है:

अगर मैं एक ResultSet एक लाख रिकॉर्ड लेकिन मेरी मेज केवल ResultSet में पहले दस रिकॉर्ड से डेटा प्रदर्शित करता युक्त है, डेटा केवल प्राप्त किया गया है जब मैं रिकॉर्ड्ससेट को SQL कथन निष्पादित करने से वापस लौटाता हूं, तो जब मैं रिकॉर्ड डेटा का अनुरोध करना शुरू करता हूं या सभी डेटा पूरी तरह मेमोरी में लोड हो जाता है?

उत्तर

30

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

यदि आपको ड्राइवर द्वारा एक बार में कितनी पंक्तियां मिलती हैं, तो आप यह नियंत्रित करने की आवश्यकता है कि आप परिणामसेट पर setFetchSize() विधि का उपयोग कर सकते हैं। यह आपको यह नियंत्रित करने की अनुमति देगा कि यह एक बार में कितने ब्लॉक पुनर्प्राप्त करता है।

+0

में 500 रिकॉर्ड MySql ड्राइवर (mysql-कनेक्टर-जे) का समर्थन करता है इस तरह के "बुद्धिमान" व्यवहार शामिल है? – Roman

+0

@Roman जेडीबीसी एपीआई इंगित नहीं करता है कि यह एक वैकल्पिक विधि है। मुझे लगता है कि MySQL सहित सभी कार्यान्वयन इस का समर्थन करेंगे। –

+0

यदि "सभी कार्यान्वयन का समर्थन करता है" तो कैसे एमडी एक्सेस के लिए जेडीबीसी-ओडीबीसी पुल ऐसा कर सकता है? एक्सेस "सीमा" या कुछ समान समर्थन नहीं करता है, है ना? – Roman

1

JDBC कल्पना निर्दिष्ट नहीं है जबकि या नहीं, परिणाम सेट में सभी डेटा प्राप्त किए गए मिलेगा, किसी भी अच्छी तरह से लिखा ड्राइवर ऐसा नहीं होगा।

कहा कि, एक स्क्रॉल परिणाम सेट अधिक क्या आपके मन में है हो सकता है:

तुम भी एक कट पंक्ति सेट पर विचार कर सकते, उस सत्र में संग्रह किया गया है (लिंक संशोधित, यह एक स्पाइवेयर पेज की ओर इशारा) (इस पर निर्भर करता है कि आपकी साइट को कितनी स्केलेबल करने की आवश्यकता है): http://java.sun.com/j2se/1.4.2/docs/api/javax/sql/RowSet.html

+1

FYI: exampledepot.com चेतावनी संदेश संदेश "हार्डड्राइव को खंडित करने की आवश्यकता" फेंकता है। – Khanna111

9

जेडीबीसी स्पेक निर्दिष्ट नहीं करता है कि डेटा स्ट्रीम किया गया है या यदि यह स्मृति में लोड हो गया है। डिफ़ॉल्ट रूप से ओरेकल धाराएं। MySQL नहीं करता है। resultset स्ट्रीम करने के लिए MySQL पाने के लिए आपको वक्तव्य पर निम्न निर्धारित करने की आवश्यकता:

pstmt = conn.prepareStatement(
     sql, 
     ResultSet.TYPE_FORWARD_ONLY, 
     ResultSet.CONCUR_READ_ONLY); 
    pstmt.setFetchSize(Integer.MIN_VALUE); 
0

सबसे अच्छा विचार एक उप क्वेरी बनाने के लिए और/एक समय में 100 या 1000 पंक्तियों को प्रदर्शित एक पृष्ठ में है। और कनेक्शन पूलिंग द्वारा कनेक्शन का प्रबंधन।

एक उप क्वेरी आप पंक्ति ओरेकल और मेरा एसक्यूएल में सीमा में गिनती का उपयोग कर सकते बनाने के लिए।

0

की सुविधा देता है कहते हैं कि हम एक मेज है कि यह

PreparedStatement stm=con.prepareStatement("select * from table"); 
stm.setFetchSize(100);// now each 100 records are loaded together from the database into the memory, 
// and since we have 500 5 server round trips will occur. 
ResultSet rs = stm.executeQuery(); 
rs.setFetchSize (50);//overrides the fetch size provided in the statements, 
//and the next trip to the database will fetch the records based on the new fetch size 
संबंधित मुद्दे

 संबंधित मुद्दे