हमारे पास एक सी # डब्ल्यूसीएफ वेब सेवा है जो विंडोज 2008 एसपी 2/आईआईएस 7 पर ओरेकल डेटाबेस तक पहुंच रही है। आम तौर पर डेटा का उपयोग ठीक काम करता है, लेकिन लोड परीक्षण के दौरान, यह अक्सर कई बार बाहर और लॉग और अपवाद कह रही:.NET के लिए ओरेकल डेटा प्रदाता: कनेक्शन अनुरोध
Error occurred when processing XXXXXXXX Web Service
Oracle.DataAccess.Client.OracleException Connection request timed out at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
at Oracle.DataAccess.Client.OracleConnection.Open()
at MyWorkspace.WorkForceDataAccess.CheckStaffIdInRSW()
at MyWorkspace.MyClass.MyFunction(MyDataType MyData)
डेटाबेस क्वेरी के लिए, हम कुछ इस तरह का उपयोग करें:
OracleConnection orConn = new OracleConnection();
orConn.ConnectionString = "user id=xxx; password=xxx; Connection Timeout=600; Max Pool Size=150; data source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST.MYDOMAIN.com)(PORT = 1771)) (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE.MYDOMAIN.com)))";
orConn.Open();
using (var cmd = new OracleCommand("MY_UTIL.check_StaffIdInRSW", orConn) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.Add("P_Staff_Id", OracleDbType.Int32);
cmd.Parameters["P_Staff_Id"].Direction = ParameterDirection.Input;
cmd.Parameters["P_Staff_Id"].Value = Convert.ToInt32(MyDataObject.StaffId);
cmd.Parameters.Add("P_retvalue", OracleDbType.Int32);
cmd.Parameters["P_retvalue"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery(); // Execute the function
//obtain result
returnVal = int.Parse(cmd.Parameters["P_retvalue"].Value.ToString());
}
मुझे लगता है कि बहुत आश्वस्त हूँ संग्रहीत की जाने वाली संग्रहीत प्रक्रिया हर समय नहीं ले रही है। यह एक बहुत ही सरल प्रक्रिया है जो जल्दी से जांचती है कि क्या P_Staff_Id तालिका में मौजूद है और परिणाम देता है।
इसके अतिरिक्त, यह केवल लोड परीक्षण के दौरान होता है। सामान्य परिचालन के दौरान चीजें ठीक होती हैं लेकिन प्रति सेकंड 1 संदेश के साथ भारी भार के दौरान, यह कुछ समय के लिए चिकनी चलने के बाद होती है।
समाधान के लिए, मैं जोड़ लिया है "कनेक्शन टाइमआउट = 600; अधिकतम पूल आकार = 150" कनेक्शन स्ट्रिंग के लिए, लेकिन यह समस्या का समाधान नहीं
हम एक ही आवेदन एक विकास सर्वर पर चल रहा है। और यह क्या करने की कोशिश करना सराहना की जाएगी करने के लिए के रूप में ठीक काम करता है। हम इस समस्या का सामना करना पड़ा कभी नहीं।
कोई सुझाव। ऐसा लगता है कि मैं विकल्पों में से निकलता जा रहा हूँ।
स्टैकट्रेस सुझाव है कि प्रक्रिया मुद्दा नहीं है। अपवाद को कनेक्शन के निष्पादन से पहले उठाया जाता है। खोलें, तो ऐसा लगता है कि डेटाबेस मशीन ओवरलोड हो गई है, इसलिए यह टाइमआउट अवधि के भीतर ग्राहक को प्रतिक्रिया नहीं दे सकती है। इसे ओरेकल में पूल आकार या प्रक्रिया सीमाओं से संबंधित नहीं होना चाहिए, इन्हें विभिन्न अपवादों को फेंकना चाहिए। इसके अलावा मैं उस पूल आकार के बारे में संदिग्ध होगा क्योंकि यह समझ में नहीं आता कि पूल डेटाबेस की संख्या से काफी बड़ा पूल हो सकता है। या आपके पास कनेक्शन रिसाव कहीं है। – Husqvik
मैंने इस समस्या के बाद कनेक्शन स्ट्रिंग में कनेक्शन टाइमआउट और मैक्स पूल आकार जोड़ा - लेकिन इससे मदद नहीं मिली। वेब सेवा इनके बिना DEV पर्यावरण में ठीक काम कर रही थी। कनेक्शन रिसाव से, क्या आप ओरेकलकनेक्शन ऑब्जेक्ट को बंद करने के बाद स्पष्ट रूप से बंद करने और निपटाने का सुझाव देंगे? – DjD
विज्ञापन कनेक्शन रिसाव - यदि कनेक्शन ऑब्जेक्ट केवल एक ही फ़ंक्शन के भीतर छोटा रहता है तो (var कनेक्शन = ...) {...} निश्चित रूप से सुरक्षित है। लेकिन मुझे उम्मीद नहीं है कि यह मुद्दा है। पूल पूरी तरह से उपयोग होने पर आपको अलग अपवाद मिलेगा। विज्ञापन लोड परीक्षण - मुझे उम्मीद है कि आप समानांतर में एप्लिकेशन या फ़ंक्शन के कई उदाहरण चलाएंगे। यह भी उम्मीद है कि आप समर्पित कनेक्शन का उपयोग करें, साझा सर्वर को ओरेकल सेटिंग के रूप में नहीं। क्या आप जांच सकते हैं कि परीक्षण के दौरान सत्र में डेटाबेस कैसा दिखता है यह देखने के लिए कि कितने सत्र और वास्तव में कितने सक्रिय सत्र हैं। – Husqvik