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();
}
}
}
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 –
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
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? –