2013-04-12 15 views
5

मैं ODP.NET संस्करण 2.111.6.20 उपयोग करते हुए मेरे .NET अनुप्रयोग के लिए पूलिंग कनेक्शन कॉन्फ़िगर करने की कोशिश कर रहा हूँ। डेटाबेस ओरेकल 11.1 है।ODP.NET पूलिंग कनेक्शन पैरामीटर

मैं अपने .NET 2.0 आवेदन में निम्नलिखित कनेक्शन स्ट्रिंग का उपयोग कर रहा:

Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=2; Max Pool Size=5; Connection Timeout=30;"

प्रलेखन कनेक्शन पूल और 2 कनेक्शन के साथ प्रारंभ करें और आवश्यकतानुसार 5 कनेक्शन करने के लिए बढ़ाने के चाहिए के अनुसार। इसे 5 कनेक्शन से अधिक नहीं होना चाहिए।

क्या मैं देख रहा हूँ कनेक्शन एक बार में 2 बढ़ रहे हैं और 10 कनेक्शन के लिए बड़ा हो रहा है। मैं वी $ सत्र तालिका से पूछताछ करके ओरेकल डेटाबेस में कनेक्शन की निगरानी कर रहा हूं, इसलिए मुझे पता है कि कनेक्शन मेरे आवेदन से उत्पन्न उस विशिष्ट एप्लिकेशन से हैं।

किसी को भी मुझे पहचान क्या कनेक्शन पूल इस आवेदन कि मैं यह जानना चाहेंगे कनेक्शन की अधिकतम संख्या से अधिक के लिए अनुमति देता है हो सकता है अंदर में क्या हो रहा हो सकता है की मदद कर सकते हैं।

नमूना सी # कोड

यहाँ डेटाबेस के लिए कॉल करने के कोड का एक नमूना है:

const string connectionString = "Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=5; Max Pool Size=5; Connection Timeout=30;"; 

using (OracleConnection connection = new OracleConnection(connectionString)) { 
    connection.Open(); 

    using (OracleCommand command = new OracleCommand("ALTER SESSION SET TIME_ZONE='UTC'", connection)) { 
     command.ExecuteScalar(); 
    } 

    using (OracleTransaction transaction = connection.BeginTransaction()) { 
     const string procSql = @"BEGIN P_SERVICES.UPDATE_VERSION(:id, :version, :installDate); END;"; 
     using (OracleCommand command = new OracleCommand(procSql, connection)) { 
      command.Parameters.Add(new OracleParameter("id", OracleDbType.Varchar2) { Value = id }); 
      command.Parameters.Add(new OracleParameter("version", OracleDbType.Varchar2) { Value = version }); 
      command.Parameters.Add(new OracleParameter("installDate", OracleDbType.TimeStamp) { Value = dateUpdated }); 

      try { 
       command.ExecuteNonQuery(); 
      } catch (OracleException oe) { 
       if (Log.IsErrorEnabled) { 
        Log.ErrorFormat("Update Error: {0}", oe.Message); 
       } 

       throw; 
      } 

      transaction.Commit(); 
     } 
    } 
} 
+0

आप आप अपने आदेश कैसे क्रियान्वित कर रहे हैं का एक उदाहरण पोस्ट कर सकते हैं? यह देखना अच्छा होगा कि क्या आप "उपयोग" का उपयोग कर रहे हैं या यदि आप मैन्युअल रूप से अपने कनेक्शन/आदेशों का निर्माण/निपटान कर रहे हैं –

+0

कोड नमूना के लिए मूल पोस्ट में अपडेट देखें ... जैसा कि आप देख सकते हैं कि मैंने कथन का उपयोग किया है कोड के बजाय मैन्युअल रूप से एक कनेक्शन – jprincipe

+0

मेरे Oracle.DataAccess विधानसभा 4.112.3.0 है निपटाने को बंद करने, कि आप के संस्करण 2.111.6.20 है एक ही विधानसभा है? यदि ऐसा है, तो शायद यह अपडेट करने का समय हो सकता है। जब तक आप एक पूर्व .NET 4 संस्करण तक सीमित नहीं हैं, और नहीं कर सकते हैं? –

उत्तर

10

मैं कारण पाया है कि अधिकतम डेटाबेस में देखा कनेक्शन नंबर कनेक्शन पूल सेटिंग में अनुमति दी अतीत बढ़ती जा रही है कनेक्शन स्ट्रिंग में।

IIS में आवेदन पूल 1. के डिफ़ॉल्ट से अलग सेट "कार्यकर्ता प्रक्रियाओं की अधिकतम संख्या" करने के लिए कॉन्फ़िगर किया गया था क्या मैं ने पाया है कि डेटाबेस में देखा कनेक्शनों की संख्या Max Pool Size * Number of Worker Processes तक बढ़ सकता है है ।

तो अगर मैं मैक्स पूल आकार 5 और 5 कार्यकर्ता की प्रक्रियाओं तो कनेक्शन की कुल संख्या की अनुमति दी 25. तो ऐसा लगता है प्रत्येक कार्यकर्ता प्रक्रिया यह एक कनेक्शन पूल का खुद का उदाहरण है कि साझा नहीं है है भी काम करती है अन्य कार्यकर्ता प्रक्रियाओं में।

+2

साथ ही, जागरूक रहें कि कनेक्शन पूल प्रति कार्यकर्ता प्रति कार्यकर्ता प्रक्रिया है, इसलिए, अधिकतम पूल आकार 5 * 5 कार्यकर्ता प्रक्रिया * 2 डोमेन प्रत्येक = 50 कनेक्शन। – RolandoCC

3

अनुसार Tom kyte:
एक कनेक्शन के लिए आप और डेटाबेस के बीच शारीरिक सर्किट है ।
एक कनेक्शन कई प्रकारों में से एक हो सकता है - सबसे लोकप्रिय समर्पित सर्वर और साझा सर्वर शुरू करते हैं।
शून्य, एक या अधिक सत्रों डेटाबेस
एक प्रक्रिया एक सत्र द्वारा उपयोग किया जाएगा स्टेटमेंट्स को निष्पादित करने के लिए दिए गए कनेक्शन पर स्थापित किया जा सकता।
कभी-कभी कनेक्शंस-> सत्र-> प्रक्रिया (उदाहरण: सामान्य समर्पित सर्वर कनेक्शन) के बीच एक से एक रिश्ते है।
कभी-कभी सत्र के लिए कनेक्शन से कई लोगों के लिए एक से एक है।
एक प्रक्रिया उदाहरण के लिए हालांकि एक विशिष्ट कनेक्शन या सत्र के लिए समर्पित किया जाना है, जब साझा सर्वर (MTS) का उपयोग करते हुए, आपका सत्र एक प्रक्रिया प्रक्रियाओं की एक पूल से आदेश एक बयान पर अमल करने में हड़पने जाएगा जरूरत नहीं है। जब कॉल खत्म हो जाती है, तो उस प्रक्रिया को प्रक्रियाओं के पूल पर वापस जारी किया जाता है।
तो
select username from v$session where username is not null चल आप उपयोग कर सकते हैं

select username, program from v$process; 

JDBC के बारे में एक उपयोगी पुस्तक और सत्र वर्तमान seesions (नहीं कनेक्शन)
कनेक्शन देखने के लिए दिखाई देगा वी.एस. कनेक्शन here

3

पाया जा सकता है आप & स्थितियों की गणना के लिए इस क्वेरी का उपयोग कर सकते हैं। इस क्वेरी का उपयोग करके, मैं पुष्टि करने में सक्षम था कि कनेक्शन स्ट्रिंग सेटिंग्स काम कर रही हैं, नीचे स्पष्टीकरण।

select COUNT(*) AS Connections 
     ,s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 
from V$process p 
join V$session s on s.paddr = p.addr 
where NOT s.UserName IS NULL 
group by s.username 
     ,s.status 
     ,s.module 
     ,s.osuser 

मैंने इसे 2 पृष्ठों के साथ चलाया जो डेटाबेस पुनर्प्राप्तियों का एक समूह था।

मैक्स पूल आकार = 5

Max Pool Size = 5

मैं वेबसर्वर उपयोगकर्ता नाम से ही खाली मॉड्यूल के तहत गिनती में उतार-चढ़ाव देखा: यहाँ मेरी भिन्न परिणाम हैं। मुझे यकीन नहीं है कि वे उस बाल्टी के साथ-साथ वेबसर्वर के नीचे क्यों दिखाई दिए।

मैक्स पूल आकार = 1

Max Pool Size = 1

जब मैं पूल आकार प्रतिबंधित, मैं सिर्फ कभी 1 खाली मॉड्यूल के लिए कनेक्शन, और 1 वेबसर्वर के लिए कनेक्शन देखा है, लेकिन फिर कनेक्शन पॉपअप DBMS_SCHEDULER, जो मेरे लिए इंगित करता है कि retreivals के बाकी लंबित थे तहत?

मैं इस साबित करता है कि अधिकतम पूल आकार काम कर रहा है लगता है, लेकिन मैं कुछ नहीं कर रहा हूँ।

+0

वी $ प्रक्रिया के बारे में जानकारी के लिए धन्यवाद। दुर्भाग्य से यह मुझे उसी संख्या का टूटना देता है जिसे मैंने v $ सत्र तालिका में पहचाना था। मैं अब कुल 20 कनेक्शन स्थापित कर रहा हूं, लेकिन इसे 25 तक पहुंच गया है। वी $ प्रोसेस टेबल से वर्तमान ब्रेकडाउन कनेक्शन उपयोगकर्ता से 14 कनेक्शन है, जो निष्क्रियता की स्थिति, w3wp.exe और osuser के मॉड्यूल के साथ है। नेटवर्क सेवा। उस उपयोगकर्ता के लिए 6 और कनेक्शन हैं जो नेटवर्क के ओएसयूएसईआर के साथ सक्रिय हैं? सेवा, लेकिन एक मॉड्यूल (शून्य)। – jprincipe

+0

क्या आप डीबीएमएस_SCHEDULER से कोई भी देखते हैं? क्या आप अपने परिणामों का मुखौटा संस्करण पोस्ट कर सकते हैं? –

+0

मुझे डीबी उपयोगकर्ता के प्रश्न में डीबीएमएस_SCHEDULER से संबंधित कुछ भी नहीं दिख रहा है। सभी कनेक्शन w3wp.exe या (शून्य) से आ रहे हैं। – jprincipe

2

यदि आपको बिल्कुल इसे ठीक करना है, और प्रदर्शन काउंटर के साथ & गंदे नीचे उतरने के इच्छुक हैं, तो यह ब्लॉग पोस्ट सहायता की हो सकती है। बहुत कम से कम यह है कि कितने कनेक्शन Oracle बनाम कितने जमा & गैर जमा कनेक्शन नेट का दावा रिपोर्ट कर रहा है जो discrepency को कम मदद कर सकता है।

http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/

ये काउंटर लगते हैं जैसे वे विशेष रूप से उपयोगी होगा:

NumberOfActiveConnectionPools 
NumberOfActiveConnections 
NumberOfFreeConnections 
NumberOfInactiveConnectionPools 
NumberOfNonPooledConnections 
NumberOfPooledConnections 
NumberOfReclaimedConnections 
NumberOfStasisConnections 
संबंधित मुद्दे