2011-01-13 17 views
8

मैं निम्नलिखित excpetion हो रही है:एसक्यूएलएक्सप्शन: प्रोटोकॉल उल्लंघन। ओरेकल JDBC ड्राइवर मुद्दा

java.sql.SQLException: Protocol violation 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:286) 
at oracle.jdbc.driver.T4C80all.receive(T4C80all.java:766) 
at oracle.jdbc.driver.T4CPreparedStatement.do0all8(T4CPreparedStatement.java:216) 
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1225) 
at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:373) 
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:284) 

ओरेकल प्रणाली सोलारिस 5.10 पर 10.2.0.3.0 चल रहा है। जेडीबीसी ड्राइवर जेडीके 1.6.0_21 पर चल रहा है (यदि यह आयात करता है तो जावा एक सोलारिस 5.10 मशीन पर भी चल रहा है)। मैंने नवीनतम और कई ऑरैकल पतले ड्राइवरों को आजमाया है जो कि ओरेकल संस्करण से बिल्कुल मेल खाते हैं।

मैं जो क्वेरी चला रहा हूं वह काफी सरल है: "key1, key2, key3 द्वारा कुछ_table ऑर्डर से चुनें * फिर परिणाम सेट के माध्यम से पुन: प्रयास करें और फ़ाइल में लिखना। तालिका में लगभग 12 मिलियन पंक्तियां हैं, इसलिए मुझे उम्मीद है कि प्रक्रिया लंबी चल रही है, लेकिन ऐसा लगता है कि इसमें 5-15 मिनट के भीतर मरना प्रतीत होता है। प्रत्येक बार जब मैं इसे चलाता हूं, यह एक अलग पंक्ति पर उड़ाता है, इसलिए मुझे नहीं लगता कि समस्या डेटा के साथ है।

मुझे ऑरैक अलर्ट लॉग मिला लेकिन मैं यह नहीं कह सका कि वहां कुछ भी मेरी प्रक्रिया से संबंधित था। फिर भी, मैं कोई ओरेकल विशेषज्ञ नहीं हूं और शायद एक ऑरैकल सेटिंग है जिसे मुझे देखने की ज़रूरत है। आश्चर्यजनक रूप से पर्याप्त है, मैं विभिन्न कनेक्शनों पर इनमें से पांच प्रकार के प्रश्न (एक जोड़े थोड़ा अधिक जटिल) चला रहा हूं और केवल दो सबसे सरल लोगों को यह समस्या मिलती है।

समस्या को कम करने के लिए क्या देखना है, इस बारे में कोई मदद या विचारों की सराहना की जाएगी।

+0

शायद आप DB सर्वर पर स्मृति से बाहर चल रहे हैं के लिए कुछ अन्य लिंक? क्या आप जावा में संसाधनों को सही ढंग से बंद कर रहे हैं? क्या यह आपकी श्रृंखला में या बाद में से किसी एक में चलने वाली पहली क्वेरी पर हो रहा है? – Riggy

उत्तर

6

स्पष्ट रूप से जावा कमांड लाइन में -d64 जोड़ना इस समस्या को हल करता है। एक Solaris 64-बिट मुद्दा की तरह लग रहा है।

+2

मेरे लिए, मेरे ojdbc ड्राइवर को अपग्रेड करने से यह तय हो गया। मैं 11.2.0.2.0 तक कूद गया और सब ठीक था। – Muel

5

भविष्य के googlers जो इस पृष्ठ के लिए हैं, यहां हमारे पास समस्या है। एप्लिकेशन लॉग और ओरेकल ट्रेस पर प्रोटोकॉल उल्लंघन अपवाद लॉग किया जा रहा था।

ओरेकल ट्रेस

यह ओरेकल ट्रेस फ़ाइल से त्रुटि

--- प्रोटोकॉल उल्लंघन का पता चला है ---

----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 --- 
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) ----- 
     select xyz 

आवेदन लॉग से

Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000]; 

लक्षण

यह अपवाद कभी-कभी हो रहा था। स्टैक ट्रेस में अलग-अलग वर्ग थे जो बहुत भ्रमित था। एसक्यूएल प्लस के साथ एसक्यूएल चलाना ठीक काम किया।

मूल कारण

अपवाद उत्पन्न हुआ था जब ओरेकल चालक एक CLOB डेटा निर्यात करने की कोशिश कर रहा था। यह केवल कुछ रिकॉर्ड के साथ हो रहा था, उनमें से सभी नहीं। डेटा के रूप में एक फ़ाइल थी। दृश्यमान रूप से हम उस डेटा के साथ क्या गलत नहीं कर पाए।

हम ऑरैकल लॉग में त्रुटियों को क्यों देख रहे थे?

तो यदि यह ड्राइवर दोष था, तो हमें ऑरैकल ट्रेस में त्रुटि क्यों दिखाई दे रही थी? तार्किक रूप से ड्राइवर त्रुटियों को केवल एप्लिकेशन लॉग तक सीमित होना चाहिए। कारण यह था कि जब प्रोटोकॉल उल्लंघन हुआ, तो कनेक्शन दूषित हो गया।यह कनेक्शन कनेक्शन पूल में वापस कर दिया गया था। उस कनेक्शन का उपयोग करने वाला कोई भी उपयोगकर्ता या नौकरी काम नहीं करेगा और त्रुटि का अनुभव करेगा। यही कारण है कि यह यादृच्छिक उपयोगकर्ताओं

समाधान

एक अल्पावधि ठीक कनेक्शन पूल में इस संपत्ति को बदलने के लिए था के साथ, यादृच्छिक स्थानों पर होगा है। हम डीबीसीपी कनेक्शन पूल का उपयोग कर रहे हैं।

ds.setTestOnBorrow (false) से बदल गया; से ds.setTestOnBorrow (सत्य);

अब पूल पूल से दूषित कनेक्शन लौटाता है, इससे पहले कि ऐप इस कनेक्शन को उधार लेता है, यह वैधता के लिए परीक्षण करेगा। यदि कनेक्शन अनुपयोगी है, तो पूल त्याग देगा और फिर ऐप को नया/मान्य कनेक्शन मिल जाएगा।

यदि आप कनेक्शन पूल लॉग सक्षम करते हैं, तो आपको सामान्य रूप से निगलने वाले अपवाद को देखना चाहिए।

ड्राइवर OJDBC 12.1.0.1 से OJDBC 12.1.0.2 पर अपग्रेड

अपग्रेड, समस्या हल भी समस्याग्रस्त पंक्तियों के लिए।

संदर्भ

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used

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