2009-08-27 14 views
17

विभिन्न जेडीबीसी टेम्पलेट विधियों में से एक का उपयोग करते समय मैं बड़े परिणाम सेट (जो स्मृति में फिट नहीं होगा) पर पुनरावृत्ति/स्क्रॉल करने के तरीके पर उलझन में है। एक इटरटेबल इंटरफ़ेस के सीधे संपर्क के बिना भी मुझे कम से कम RowCallbackHandler के उदाहरणों को कहने की उम्मीद होगी जबकि क्वेरी समाप्त होने के बाद निष्पादित नहीं हो रही है (या ढेर ओवरफ्लोट्स)।वसंत जेडीबीसी समर्थन और बड़े डेटासेट

मैं (जो ढेर अतिप्रवाह पर this post को भावना में समान होने के बावजूद मेरे लिए कुछ भी नहीं बदला) this पर एक नज़र एक था और वसंत मंचों में this पोस्ट पर। उत्तरार्द्ध यह सुझाव देता है कि कर्सर डेटा को लाने के दौरान कॉलबैक हैंडलर को वास्तव में कॉल किया जाना चाहिए। हालांकि मेरे परीक्षण ऐसा कोई व्यवहार नहीं दिखाते हैं।

डेटाबेस एक Oracle10g है। मैं 11.1.0.7.0-उत्पादन चालक और वसंत 2.5.6.SEC01 का उपयोग कर रहा हूं। परिणाम सेट पर पुन: प्रयास करने के लिए कोई भी विचार, अधिमानतः RowMapper आदि के मैपिंग तर्क को रखते हुए?

उत्तर

19

ओरेकल जेडीबीसी चालक setFetchSize() विधि java.sql.Statement पर विधि का उचित समर्थन करता है, जो आपको यह नियंत्रित करने की अनुमति देता है कि ड्राइवर एक बार में कितनी पंक्तियां लाएगा।

हालांकि, RowMapper वसंत द्वारा प्रत्येक पंक्ति को स्मृति में पढ़कर काम करता है, RowMapper को किसी ऑब्जेक्ट में अनुवाद करने के लिए, और प्रत्येक पंक्ति की ऑब्जेक्ट को एक बड़ी सूची में संग्रहीत करने के लिए प्राप्त करता है। यदि आपका परिणाम सेट बड़ा है, तो यह सूची बड़ी होगी, भले ही जेडीबीसी पंक्ति डेटा कैसे प्राप्त करे।

यदि आपको बड़े परिणाम सेट को संभालने की आवश्यकता है, तो RowMapper स्केल करने योग्य नहीं है। आप JdbcTemplate पर संबंधित विधियों के साथ RowCallbackHandler का उपयोग करने पर विचार कर सकते हैं। RowCallbackHandler यह निर्धारित नहीं करता है कि परिणाम कैसे संग्रहीत किए जाते हैं, उन्हें स्टोर करने के लिए इसे छोड़कर।

+1

setFetchSize ने मेरे लिए चीजें नहीं बदलीं, मैंने पहले इसका उपयोग करने की कोशिश की। क्या आप ओरेकल उदाहरण के खिलाफ विकसित होते हैं? मेरे लिए RowCallBackHandler बस लटकता है, क्वेरी को समाप्त करने की प्रतीक्षा करता है जैसा कि मैंने अपने ओपी में लिखा था। – yawn

+2

स्पष्ट रूप से मैं अपने परीक्षण में जेडीबीसी टेम्पलेट पर प्रॉपर्टीजसेट() के बाद कॉल भूल गया था। शर्मनाक है, लेकिन अब यह काम करता है: *) – yawn

4

यह ड्राइवर/कनेक्शन की एक संपत्ति है कि क्या आपको डेटा वापस स्ट्रीम करना है या फिर इसे एक खंड में भेजना है या नहीं। उदाहरण के लिए, एसक्यूएल सर्वर में, आप SelectMethod संपत्ति कनेक्शन यूआरएल पर का उपयोग करें:

jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct

direct के मूल्य का मतलब है कि परिणाम एक ही बार में आना चाहिए। अन्य विकल्प cursor है, जो आपको यह निर्दिष्ट करने की अनुमति देता है कि आप कनेक्शन को स्ट्रीम करने के लिए कनेक्शन चाहते हैं। मुझे यकीन नहीं है कि ओरेकल डेटा स्रोत के लिए एनालॉग क्या है, मुझे डर है

RowCallbackHandler निश्चित रूप से मेरे लिए काम करता है।

+0

हाँ, आदर्श आप एक डाटासेट में डाल नहीं है, आप रिकॉर्ड जबकि कनेक्शन खुला पूछने keepin अगर अधिक रिकॉर्ड देखते हैं हड़पने होगा। मैंने इसे .NET में किया और प्रदर्शन में काफी अच्छा सुधार हुआ। मुझे कल्पना है कि जावा के लिए कुछ ऐसा ही होगा, खासकर वसंत में। – Zoidberg

+0

@ * ज़ॉइडबर्ग * - ओपी एक पंक्ति कॉलबैक हैंडलर –

+0

का उपयोग करके सही चीज कर रहा है, यह वादा करता है। दुर्भाग्य से मुझे ओरेकल जेडीबीसी दस्तावेज में इस SQL ​​सर्वर यूआरएल सेटिंग के समान कुछ नहीं मिला। – yawn

-2

जावा एसक्यूएल परिणामों को स्मृति में खींचने के लिए यहां एक अच्छी लाइब्रेरी है।

http://casperdatasets.googlecode.com

आप स्क्रॉल कर सकते हैं/डाटासेट के माध्यम से पुनरावृति, तो आप इसके खिलाफ क्वेरी भेज सकते हैं, और अनुकूलन के लिए अनुक्रमणिका का निर्माण। यह java.sql.resultset इंटरफ़ेस को भी लागू करता है ताकि आप इस डेटासेट से परिणामों पर अपने जेडीबीसी कोड में न्यूनतम chnages के साथ काम करना जारी रख सकें।

+0

इसमें एक एडाप्टर भी है जो एक जेडीबीसी परिणामसेट को इन-मेमोरी परिणामसेट में परिवर्तित करेगा - मुझे लगता है कि आप अपने एडाप्टर को अपने वसंत जेडीबीसी परिणाम कॉलबैक विधि में आमंत्रित कर सकते हैं। –

+1

क्षमा करें, लेकिन "बड़े परिणाम सेट पर पुनरावृत्ति/स्क्रॉल कैसे करें (जो * स्मृति * में फिट नहीं होगा)"। – yawn

5

आप springjdbc-iterable लाइब्रेरी का उपयोग हो सकता है:

CloseableIterator<MyObj> iter = jt.queryForIter("select ...", params, mapper); 

इटरेटर ऑटो बंद कर दिया थकावट पर होगा या मैन्युअल रूप से बंद हो सकता है। यह केवल लेनदेन सीमाओं के भीतर ही काम करेगा।

अस्वीकरण: मैं इस पुस्तकालय

0
  1. लिखा एक कस्टम संग्रहीत प्रक्रिया फैली कि StoredProcedure
  2. एक RowCallBackHandler कि एक समय में प्रत्येक पंक्ति, एक संभाल कर सकते हैं बनाएँ।
  3. अपने पैरामीटर घोषित करें। यदि आपके पास परिणाम सेट है, तो उसे पहले घोषित करें। SqlReturnResultSet वर्ग का प्रयोग करें और
  4. संकलित
  5. अपने RowCallBackHandler
  6. प्रचार किसी अन्य मानकों का प्रयोग करके इसे बनाने के मैं अपने ग्राहक संग्रहीत प्रक्रिया
  7. के निर्माता में से 5 तक 2 चरणों में किया था जिसमें एक नक्शा बनाएं अपने इनपुट पैरामीटर
  8. इनपुट पैरामीटर के साथ अपनी संग्रहीत प्रक्रियाओं को निष्पादित करें

मैं कोड प्रदान करूंगा, लेकिन निम्नलिखित आलेख में यह सारी जानकारी शामिल है।

Calling Stored Procedures with Spring JDBC Templates

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