Ein in C# Oracle-Client geschriebenes Programm, das "Connection leak" aufweist und nicht alle Datenbankverbindungen schließt. Nach einiger Zeit kann es keine Verbindung mehr zur Datenbank herstellen, da zu viele offene Verbindungen bestehen.Der beste Weg, Oracle Verbindungsleck zu erkennen?
Ich schrieb die folgende Hilfsfunktion (recht expansive):
private static int tryFindConnCount(){
var connstk = new Stack<Oracle.ManagedDataAccess.Client.OracleConnection>();
try
{
for (var i = 0; i < 10000; ++i)
{
var conn = new Oracle.ManagedDataAccess.Client.OracleConnection(
myDatabaseConnection);
conn.Open();
connstk.Push(conn);
}
}
catch(Exception e)
{
foreach (var conn in connstk)
{
conn.Close();
}
}
return connstk.Count;
}
Hier ist der Code in einem Testfall, dass die oben verwendet:
var co = tryFindConnCount();
CodeThatMayLeakConnection();
var cn = tryFindConnCount();
Assert.That(cn, Is.EqaulTo(co));
Es half mir mindestens einen Fall zu identifizieren das haben Verbindungsleck.
Das Problem von tryFindConnCount
ist, dass es nie in der Produktion verwendet werden sollte. Und ich denke, es sollte einen Weg geben, den gleichen Wert viel billiger zu erhalten.
Wie kann ich dies im Code tun, damit ich diesen Wert in der Produktion überwachen kann?
Sie können die Oracle-Datenbank abfragen, um die Gesamtzahl der Verbindungen von Verbindungen zu erhalten, die von diesem Programm stammen. Zum Beispiel: Wählen Sie Anzahl (*) von gv $ Sitzung wo Maschine = 'XXXXX' und Benutzername = 'YYYYY' und Programm = 'ZZZZZ'; – ivanzg
Sie benötigen nur einige spezifische Werte, die diese Verbindungen eindeutig identifizieren, wie zum Beispiel die Maschine, von der sie stammt -> "server.123.local.com", DB-Benutzername, mit dem die Verbindungen in die Datenbank gelangen und vielleicht den Programmnamen wie "clientprogram1 "oder ein anderes Attribut. – ivanzg