2013-04-12 6 views
5

Ich versuche, Verbindungspooling für meine .NET-Anwendung mit ODP.NET Version 2.111.6.20 zu konfigurieren. Die Datenbank ist Oracle 11.1.ODP.NET Connection Pooling-Parameter

Ich verwende die folgende Verbindungszeichenfolge in meiner .NET 2.0-Anwendung:

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

Nach der Dokumentation des Verbindungspool mit 2 Anschlüssen und und erhöht bis zu 5 Verbindungen nach Bedarf initialisieren sollte. Es sollte niemals höher als 5 Verbindungen werden.

Was ich sehe, ist die die Verbindungen wachsen 2 auf einmal und wachsen bis zu 10 Verbindungen. Ich überwache die Verbindungen in der Oracle-Datenbank, indem ich die v $ Sitzungstabelle abfrage, also weiß ich, dass die Verbindungen von dieser bestimmten Anwendung stammen, die von meiner Anwendung stammt.

Wenn mir jemand helfen kann zu identifizieren, was im Verbindungspool innerhalb dieser Anwendung passieren könnte, die mehr als die maximale Anzahl von Verbindungen zulassen würde, würde ich es begrüßen.

Probe C# -Code

Hier ist ein Beispiel für den Code, die Anrufe auf die Datenbank zu machen:

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

Können Sie ein Beispiel dafür angeben, wie Sie Ihre Befehle ausführen? Es wäre gut zu sehen, wenn Sie "USING" verwenden oder wenn Sie Ihre Verbindungen/Befehle manuell erstellen/entsorgen –

+0

sehen Sie die Aktualisierung des ursprünglichen Beitrags für das Codebeispiel ... wie Sie sehen können, habe ich Anweisungen in der Code, anstatt manuell zu schließen, ein Entsorgen der Verbindungen – jprincipe

+0

Meine Oracle.DataAccess-Assembly ist 4.112.3.0, ist das die gleiche Assembly, die Sie Version 2.111.6.20 haben? Wenn ja, ist es vielleicht an der Zeit zu aktualisieren. Es sei denn, Sie sind auf eine vor .NET 4 Version beschränkt und können nicht? –

Antwort

10

Ich habe den Grund, dass die Maximum-Verbindungen in der Datenbank gesehen steigt über die zulässige Anzahl in den Verbindungs-Pool-Einstellungen gefunden in der Verbindungszeichenfolge.

Der Anwendungspool in IIS konfiguriert wurde „Maximale Anzahl der Arbeitsprozesse“ setzen anders als die Standardeinstellung von 1. Was ich gefunden habe ist, dass die Anzahl der Verbindungen in der Datenbank aufwachsen kann zum Max Pool Size * Number of Worker Processes gesehen .

Also, wenn ich Max Pool Size von 5 und 5 Arbeitsprozessen dann die Gesamtzahl der Verbindungen erlaubt ist 25. So scheint es, dass jeder Worker-Prozess hat seine eigene Instanz eines Verbindungspools ist, die nicht mit anderen geteilt wird über andere Arbeitsprozesse hinweg.

+2

Beachten Sie außerdem, dass die Verbindungspools pro Arbeitsprozess pro App-Domäne sind, also Max. Poolgröße von 5 * 5 Arbeitsprozess * 2 Domänen jeweils = 50 Verbindungen. – RolandoCC

3

zu Tom kyte:
Verbindung nach ist eine physische Verbindung zwischen Ihnen und der Datenbank .
Eine Verbindung könnte einer der vielen Arten sein - am beliebtesten beginnen DEDICATED Server und SHARED-Server.
Null, eine oder mehrere Sitzungen können über eine bestimmte Verbindung zur Datenbank hergestellt werden
Ein Prozess wird von einer Sitzung verwendet, um Anweisungen auszuführen.
Manchmal gibt es eine Eins-zu-Eins-Beziehung zwischen CONNECTION-> SESSION-> PROCESS (zB: eine normale dedizierte Server-Verbindung).
Manchmal gibt es eine Eins zu viele von Verbindung zu Sitzungen.
Ein Prozess muss nicht für eine bestimmte Verbindung oder Sitzung jedoch gewidmet sein, zum Beispiel, wenn Shared Server (MTS) verwenden, wird Ihre Sitzung einen Prozess aus einem Pool von Prozessen in Reihenfolge eine Anweisung ausführen. Wenn der Aufruf beendet ist, wird dieser Prozess an den Prozesspool zurückgegeben.
So
select username from v$session where username is not null ausgeführt werden aktuelle seesions zeigen (keine Verbindungen)
die Verbindungen sehen Sie

select username, program from v$process; 

Ein nützliches Buch über JDBC und Session VS Anschluss here gefunden werden konnte

3

verwenden Sie kann diese Abfrage verwenden, um Ihre Verbindungsanzahl zu überwachen & Status. Mit dieser Abfrage konnte ich bestätigen, dass die Einstellungen für die Verbindungszeichenfolge funktionieren, siehe unten.

Ich lief dies mit 2 Seiten, die eine Reihe von Datenbankabrufungen gemacht.Hier sind meine abweichenden Ergebnisse:

Max Pool Size = 5

Max Pool Size = 5

ich sah, Schwankungen in der Zählung unter dem leeren Modul mit demselben Benutzername wie der Webserver. Ich bin nicht sicher, warum sie unter diesem Eimer sowie dem Webserver aufgetaucht sind.

Max Pool Size = 1

Max Pool Size = 1

Wenn ich die Poolgröße beschränkt, ich sah immer nur 1 Anschluss für das leere Modul und 1 Anschluss für den Webserver, aber dann tauchten Verbindungen nach oben unter DBMS_SCHEDULER, was mir anzeigt, dass der Rest der Re-Rivalen anhängig war?

Ich denke, das beweist, dass die Max Pool Size funktioniert, aber ich bin mir nicht sicher.

+0

Vielen Dank für die Informationen über v $ process. Leider gab mir das nur eine Aufschlüsselung der gleichen Nummern, die ich in der v $ Sitzungstabelle identifiziert habe. Ich sehe insgesamt 20 Verbindungen, die jetzt hergestellt werden, aber haben gesehen, dass es bis zu 25 ist. Die aktuelle Aufteilung von der v $ Prozesstabelle ist 14 Verbindungen vom Verbindungsbenutzer mit dem Status von INACTIVE, Modul von w3wp.exe und osuser von NETZWERKDIENST. Es gibt weitere 6 Verbindungen für diesen Benutzer, die mit dem OSUSER von NETWORK SERVICE INAKTIV sind, aber ein Modul von (null). – jprincipe

+0

Sehen Sie irgendwelche von DBMS_SCHEDULER? Können Sie eine maskierte Version Ihrer Ergebnisse posten? –

+0

Ich sehe nichts in Bezug auf DBMS_SCHEDULER für den betreffenden DB-Benutzer. Alle Verbindungen kommen von w3wp.exe oder (null). – jprincipe

2

Wenn Sie dies unbedingt beheben müssen und bereit sind, & schmutzig mit Leistungsindikatoren herunterzukommen, könnte dieser Blogbeitrag hilfreich sein. Zumindest kann es helfen, eine Diskrepanz zwischen der Anzahl der Verbindungen, die Oracle meldet, und der Anzahl der gepoolten & nicht gepoolten .NET-Verbindungen einzuschränken.

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

Diese Zähler scheinen, wie sie besonders nützlich sein würde:

NumberOfActiveConnectionPools 
NumberOfActiveConnections 
NumberOfFreeConnections 
NumberOfInactiveConnectionPools 
NumberOfNonPooledConnections 
NumberOfPooledConnections 
NumberOfReclaimedConnections 
NumberOfStasisConnections