2013-10-29 3 views
41

से कनेक्ट करते समय "एक पठन कॉल से शून्य प्राप्त करें" त्रुटि से कैसे संपर्क करें, मैं अमेज़ॅन आरडीएस उदाहरण पर ओरेकल 11GR2 चला रहा हूं। कभी-कभी मुझे DriverManager.getConnection(getUrl()) पर कॉल करते समय IO Error: Got minus one from a read call मिलता है और मुझे यकीन नहीं है कि क्यों। अन्य अनुप्रयोग सही ढंग से काम करते हैं।अमेज़ॅन आरडीएस ओरेकल उदाहरण

चीजों को और भ्रमित करने के लिए, त्रुटि अवसर पर स्वयं को सही करेगी (कार्यक्रम के अगले पुनरावृत्ति के बाद)।

मुझे "रीड कॉल से एक को कम से कम कैसे मिला" त्रुटि से संपर्क करना चाहिए?

पूर्ण स्टैक ट्रेस: ​​

java.sql.SQLRecoverableException: IO Error: Got minus one from a read call 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489) 
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553) 
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254) 
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) 
    at java.sql.DriverManager.getConnection(DriverManager.java:579) 
    at java.sql.DriverManager.getConnection(DriverManager.java:243) 
    at com.cwd.facile.db.Database.<init>(Database.java:44) 
    at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.java:29) 
    at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205) 
    at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.java:188) 
    at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970) 
    at com.cwd.facile.Main.main(Main.java:47) 
Caused by: oracle.net.ns.NetException: Got minus one from a read call 
    at oracle.net.ns.Packet.receive(Packet.java:311) 
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:300) 
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140) 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340) 
    ... 12 more 

Database.java लाइन 44: setConn(DriverManager.getConnection(getUrl()));

अन्य जानकारी:

  • मैंने सोचा कि यह एक बुरा JDBC यूआरएल था, लेकिन यह काम करता है, कभी-कभी विफल होने से पहले अंत में दिन के लिए।
  • अमेज़न आरडीएस एक प्रबंधित उदाहरण है और विन्यास बदलाव
  • मैं कनेक्टिविटी के लिए ojdbc6.jar उपयोग कर रहा हूँ संभव नहीं हो सकता

उत्तर

60

समस्या का तत्काल कारण है कि JDBC ड्राइवर एक से पढ़ने के लिए प्रयास किया गया है है नेटवर्क सॉकेट जिसे "दूसरे छोर" से बंद कर दिया गया है।

यह कुछ बातें की वजह से हो सकता है:

  • दूरस्थ सर्वर कॉन्फ़िगर किया गया है, तो (जैसे कि "SQLNET.ora" फ़ाइल में) आपके आईपी से कनेक्शन स्वीकार नहीं करने के लिए।

  • यदि जेडीबीसी यूआरएल गलत है, तो आप किसी ऐसे डेटाबेस से कनेक्ट करने का प्रयास कर सकते हैं जो डेटाबेस नहीं है।

  • यदि डेटाबेस सेवा के लिए बहुत से खुले कनेक्शन हैं, तो यह नए कनेक्शन को अस्वीकार कर सकता है।

लक्षणों को देखते हुए, मुझे लगता है कि "बहुत सारे कनेक्शन" परिदृश्य सबसे अधिक संभावना है। इससे पता चलता है कि आपका आवेदन कनेक्शन लीक कर रहा है; यानी कनेक्शन बनाना और फिर उन्हें बंद करने में असफल रहा।

+2

धन्यवाद स्टीफन मैं लीकी कनेक्शन –

0

मैं स्टीफन सी के उत्तर में वृद्धि करना चाहता हूं, मेरा मामला पहले बिंदु पर था। इसलिए चूंकि हमारे पास कंपनी में आईपी पते आवंटित करने के लिए डीएचसीपी है, इसलिए डीएचसीपी ने बिना किसी न तो मुझे और न ही ओरेकल पूछे बिना मेरी मशीन का पता बदल दिया। तो नीले ऑरैकल से बाहर कुछ भी करने से इनकार कर दिया और शून्य को एक डरावना अपवाद दिया। तो यदि आप इसे एक बार और हमेशा के लिए काम करना चाहते हैं, और चूंकि SQLNET.ora फ़ाइल का TCP.INVITED_NODES वाइल्डकार्ड स्वीकार नहीं करता है जैसा कि here कहा गया है, तो आप आईपी पते के बजाय मशीन का होस्टनाम जोड़ सकते हैं।

+0

देखेंगे, यही कारण है कि हमारे पास सर्वर के लिए स्थिर आईपी हैं। वैकल्पिक रूप से, यदि आप डीएचसीपी का उपयोग करना चाहते हैं, तो आप एमएसी पते को डीएचसीपी आरक्षण के माध्यम से एक विशिष्ट आईपी असाइन कर सकते हैं। – Sun

+0

@Sun मेरा पीसी _the_ सर्वर था। –

+0

हाँ, अगर आपके पास आईपी प्रावधान पर नियंत्रण नहीं है ... आप इतना नहीं कर सकते हैं लेकिन उम्मीद है कि होस्टनाम आईपी एड्रेस चेंज के साथ जारी रहेगा। – Sun

9

हमें एक ही समस्या का सामना करना पड़ा और तय किया गया। नीचे कारण और समाधान है।

समस्या

जब हम कनेक्शन पूल तंत्र तो अनुप्रयोग सर्वर के माध्यम से एक डेटाबेस कनेक्शन बनाने (हमारे मामले में यह JBoss है) के रूप में मिनट-कनेक्शन पैरामीटर में उल्लेख किया कनेक्शन बनाने। यदि आपके पास 10 एप्लिकेशन चल रहे हैं और प्रत्येक के पास 10 के रूप में न्यूनतम कनेक्शन है तो डेटाबेस में कुल 100 सत्र बनाए जाएंगे। इसके अलावा हर डेटाबेस में वहाँ, एक अधिकतम सत्र पैरामीटर है अपने कुल कनेक्शन को पार करता है, तो यह है कि सीमा से आप मिल जाएगा "गॉट शून्य से पढ़ने कॉल से एक" FYI करें: क्वेरी के नीचे अपने कुल सत्र को देखने के लिए प्रयोग करें

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username 

समाधान: हमारे डीबीए की मदद से हमने उस अधिकतम सत्र में वृद्धि की ताकि हमारे सभी आवेदन मिनी-कनेक्शन समायोजित हो सकें।

+0

यदि आप MAXPROCESS या MAXSESSION से अधिक हैं तो आपको उस स्थिति के लिए विशिष्ट ओआरए-त्रुटियां मिलती हैं, कनेक्शन बस बंद नहीं होता है। – eckes

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