2010-07-30 15 views
7

मेरे पास एक .Net सेवा है जो प्रत्येक अनुरोध पर ओरेकल डेटाबेस से कनेक्ट होती है। यह शुरुआत में ठीक काम करता है, लेकिन कुछ अनुरोधों के बाद मुझे मिलना शुरू हो गया:Oracle.DataAccess.Client.OracleException ORA-03135: कनेक्शन खो गया संपर्क

Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact 
    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader() 
    at MyApp.Services.OracleConnectionWithRetry.ExecuteReader(OracleCommand command) 
    ... 

कोई विचार क्या समस्या हो सकती है? मैं सभी कनेक्शन, परिणाम और पैरामीटर का निपटान करता हूं। इस सेवा पर भार बहुत अच्छा है।

+0

जिज्ञासा से बाहर, क्या आपने कनेक्शन की स्थिति को प्रोग्रामेटिक रूप से जांचने के साथ इस समस्या को हल किया है (यानी यदि पहले से ही खुला है, कुछ भी नहीं करें) या वेब.कॉन्फिग में मान्यकरण कनेक्शन सही है या दोनों? –

+2

हाय @ ल्यूक, मैंने व्यक्तिगत समस्या पर इस समस्या को हल किया - मैंने पीएचडी करने के लिए अपना काम छोड़ दिया :) – Grzenio

+0

हे बधाई हो, दुर्भाग्य से मैं उस मार्ग से नीचे नहीं जा सकता, पर्याप्त स्मार्ट नहीं;) –

उत्तर

11

ऐसा इसलिए होता है क्योंकि आपका कोड ओरेकल कनेक्शन पूल से कनेक्शन का अनुरोध करता है और कनेक्शन पूल ओरेकल डीबी से डिस्कनेक्ट/स्टेल कनेक्शन देता है। ODP.NET क्लाइंट को भेजे गए कनेक्शन की कनेक्शन स्थिति का परीक्षण नहीं करता है।

तो सुरक्षा के लिए, या तो आप पूल से प्राप्त कनेक्शन के लिए connection status == Open जाँच जब आप एक Connection.Open()

या

जाने ODP.NET कर निर्धारित करके आप के लिए जाँच करना Web.config में आपकी कनेक्शन स्ट्रिंग में Validate Connection = true

दोनों तरीकों से प्रदर्शन पर असर पड़ता है क्योंकि प्रत्येक बार जब आप डेटाबेस से कनेक्ट करने की आवश्यकता होती है तो कनेक्शन स्थिति का परीक्षण करते हैं।

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

+0

मुझे वैध समाधान होने के लिए मान्य कनेक्शन विकल्प मिला। यह मेरे आवेदन के लिए औसतन 20% ओवरहेड जोड़ा गया। हालांकि यह बहुत अधिक होगा यदि आप बहुत सी छोटी पूछताछ करते हैं। साथ ही, कनेक्शन की स्थिति की जांच करने के लिए कुछ ओवरहेड है, मुझे लगता है कि इसमें सर्वर के लिए राउंड-ट्रिप शामिल हो सकता है। मेरे परीक्षण में कनेक्शन स्ट्रिंग में मान्य कनेक्शन विकल्प सेट करने के बजाय कोड में प्रत्येक बार कनेक्शन की जांच करने के लिए कोई तेज़ नहीं था। –

+0

Thats क्यों शुरू करने के लिए जांच से बचें। आपके पास कनेक्शन के साथ जाओ। यदि कोई मौजूदा विफल रहता है तो एक नया कनेक्शन प्राप्त करें। – sandyiit

+0

जब आप कनेक्शन स्ट्रिंग के अंदर मान्य कनेक्शन को स्थानांतरित करते हैं, तो क्या आप ओआरए फ़ाइल के भीतर या app.config में बात कर रहे हैं? – William

2

मैंने यह भी देखा है; कनेक्शन स्ट्रिंग में "पूलिंग = झूठी" के साथ कनेक्शन पूलिंग बंद करने का प्रयास करें। मेरे पास एक सिद्धांत है कि पूल में निष्क्रिय कनेक्शन समाप्त हो जाते हैं, लेकिन ओडीपी.नेट को यह नहीं पता है कि वे समाप्त हो गए हैं, और फिर जब आपका ऐप एक पकड़ लेता है और कुछ करने की कोशिश करता है तो आपको वह अपवाद मिलता है।

+0

किसी ने यह भी सुझाव दिया कि डेटाबेस के बाउंस होने के बाद ऐसा होता है। – Grzenio