すべてのデータベース接続を閉じていない「接続リーク」があることが判明したC#Oracleクライアントで作成されたプログラムで、開いている接続が多すぎるため、しばらくしてもデータベースに接続できなくなります。Oracleの接続リークを検出する最善の方法は?
私は、次のヘルパー関数(かなり広大)を書いた:ここ
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;
}
は、上記を使用してテストケースのコードです:
var co = tryFindConnCount();
CodeThatMayLeakConnection();
var cn = tryFindConnCount();
Assert.That(cn, Is.EqaulTo(co));
それは私が少なくとも一つのケースを識別助けました接続リークが発生しています。
tryFindConnCount
の問題は、本番環境では使用しないことです。そして私は、同じ価値をもっと安く得るための方法があるべきだと思います。
コードでこれを実行すると、プロダクションでこの値を監視できますか?
Oracle dbを問い合せて、そのプログラムから発生した接続の総接続数を取得できます。例:select count(*) from gv $ session machine = 'XXXXX' 、username = 'YYYYY' 、program = 'ZZZZZ'; – ivanzg
"server.123.local.com"、接続がデータベースに入るDBユーザ名、そしておそらく "clientprogram1"のようなプログラム名のような、それらの接続を一意に識別する特定の値が必要です。 "または他の何らかの属性です。 – ivanzg