2012-04-16 23 views
8

निम्न त्रुटि से बचने के लिए ओरेकल में लंबे मूल्यों को संभालने के लिए मैं एक कस्टम लांग क्लास कैसे लिखूं?'से उत्पन्न होने के लिए कस्टम प्रकार को हाइबरनेट करें: java.sql.SQLException: स्ट्रीम पहले ही बंद कर दिया गया है'

कारण: java.sql.SQLException: स्ट्रीम पहले ही बंद कर दिया गया है।

धन्यवाद

उत्तर

8

ओरेकल recommends not usingLong और Long Raw कॉलम (Oracle 8i के बाद से)। वे केवल विरासत कारणों से ओरेकल में शामिल हैं।

जब एक प्रश्न एक या अधिक लंबी या लंबी रॉ स्तंभों का चयन करता है: क्या तुम सच में उन्हें इस्तेमाल करने की जरूरत है, तो आपको पहले इन स्तंभों ResultSet में किसी भी अन्य स्तंभों को स्पर्श करने के लिए प्रयास करने से पहले संभाल चाहिए:

Docs , जेडीबीसी चालक स्ट्रीमिंग मोड में क्लाइंट को इन कॉलम को स्थानांतरित करता है। ExecuteQuery या अगले को कॉल करने के बाद, लंबे कॉलम का डेटा पढ़ने की प्रतीक्षा कर रहा है।

लंबे कॉलम के साथ टेबल न बनाएं। इसके बजाए बड़ी वस्तु (एलओबी) कॉलम, सीएलओबी, एनसीएलओबी, और बीएलओबी का प्रयोग करें। लंबे कॉलम केवल पिछड़े संगतता के लिए समर्थित हैं। ओरेकल अनुशंसा करता है कि आप मौजूदा लंबे कॉलम को LOB कॉलम में कनवर्ट करें। LOB कॉलम लंबे कॉलम की तुलना में बहुत कम प्रतिबंधों के अधीन हैं।

हाइबरनेट के लिए - यह question देखें।

+0

मैं के लिए हाइबरनेट प्रयोक्ता प्रकार को लागू करने से कोशिश की लंबी, लेकिन अब भी वही त्रुटि की वजह से: java.sql.SQLException: स्ट्रीम को पहले से ही किया गया है closed.Can किसी को मुझ में सुझाव है इस त्रुटि से बचने के लिए? – user1316131

+0

कुछ और अधिक परिष्कृत करने से पहले ... क्या आपने नए जेडीबीसी ड्राइवर की कोशिश की है? – Anonymous

+0

और एक और बात, हाइबरनेट को 'परिणामसेट' से कॉलम प्राप्त होते हैं क्योंकि उनकी आवश्यकता होती है। क्या पहले 'लंबा रॉ' कॉलम प्राप्त करना ठीक होगा? (ओरेकल मानता है कि कॉलम को बाएं से दाएं क्रम में एक्सेस किया जाता है और स्ट्रीम कॉलम के बाद कॉलम एक्सेस होने पर धाराएं बंद होती हैं) – Anonymous

4

निम्नलिखित मूल प्रश्न 'ओरेकल में लंबे मूल्यों को संभालने के लिए कस्टम लांग क्लास कैसे लिखना है' का जवाब नहीं देता है, लेकिन ओरेकल लंबे कच्चे कॉलम से पूछताछ करते समय 'स्ट्रीम पहले ही बंद कर दिया गया है' त्रुटि से बचने में मददगार हो सकता है।

हमें विरासत डेटाबेस का उपयोग करके इस त्रुटि का सामना करना पड़ा जिसमें स्तंभ प्रकार बदलने की कोई संभावना नहीं थी। हम स्प्रिंग का उपयोग हाइबरनेट 3 सत्र कारखाने और लेनदेन प्रबंधक के साथ करते हैं। समस्या तब हुई जब एक से अधिक कार्य डीएओ को समवर्ती रूप से एक्सेस कर रहे थे। हम ojdbc14.jar ड्राइवर का उपयोग कर रहे हैं और कोई किस्मत के साथ एक नया प्रयास किया है।

ओजडीबीसी चालक के कनेक्शन गुणों में उपयोग करने के लिए FetchSizeWithLongColumn = सही सेटिंग समस्या हल हो गई। OracleDriver API

यह केवल एक ही संपत्ति है। इसका उपयोग किसी भी अन्य चालकों के साथ नहीं किया जाना चाहिए। यदि "सत्य" पर सेट किया गया है, तो 'SELECT' में डेटा पुनर्प्राप्त करते समय प्रदर्शन में सुधार होगा, लेकिन लंबे कॉलम को संभालने के लिए डिफ़ॉल्ट व्यवहार को कई पंक्तियां (प्रीफ़ेच आकार) लाने के लिए बदला जाएगा। यह का अर्थ है कि इस डेटा को पढ़ने के लिए पर्याप्त स्मृति आवंटित की जाएगी। इसलिए यदि आप इस प्रॉपर्टी का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आपके द्वारा लंबे कॉलम पुनर्प्राप्ति बहुत बड़ी नहीं हैं या आप स्मृति से बाहर हो सकते हैं। यह संपत्ति को जावा प्रॉपर्टी के रूप में भी सेट किया जा सकता है: जावा -Doracle.jdbc।useFetchSizeWithLongColumn = सच myApplication

-1

इस प्रणाली के टेबल के एक प्रश्न में क्या होता है:

SELECT * FROM all_tab_columns 
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%'; 
+0

यह प्रश्न का उत्तर कैसे देता है? – gaborsch

-1

मैं जब आप परिणाम कई बार सेट से एक Oracle लंबी मूल्य प्राप्त करने की कोशिश आप यह संदेश प्राप्त लगता है।

मैं की तरह कोड था:

 rs.getString(i+1) ; 
     if (rs.wasNull()) continue ; 

     set(queryAttr[i], rs.getString(i+1)) ; 

और मैं आने शुरू हो गए "स्ट्रीम पहले से ही बंद कर दिया गया।" त्रुटि। मैं जब मैं करने के लिए कोड बदल त्रुटि मिल रही है बंद कर दिया:

 String str = rs.getString(i+1) ; 
     if (rs.wasNull()) continue ; 

     set(queryAttr[i], str) ; 
संबंधित मुद्दे

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