C# アプリケーションで重大なメモリ リークが発生しています。考えられるすべての原因を突き止めたところ、データ層SqlConnection
がメモリ リークの原因であることがわかりました。多くのSqlConnection
リクエストを実行しています。1 秒あたり約 10 件のリクエスト。そして、1 日あたり 200M のリークが発生しています。
SqlConnection
基本クラスとして次のアクセスを使用しています。
public class Access : IDisposable
{
protected SqlConnection connection;
private readonly object locker = new object();
protected void OpenConnection()
{
if (this.connection == null)
{
lock (locker)
{
if (this.connection == null)
{
string conn = Config.Data["data"]["mainConnString"];
this.connection = new SqlConnection(conn);
this.connection.Open();
}
}
}
else if (this.connection.State == System.Data.ConnectionState.Closed)
{
lock (locker)
{
if (this.connection.State == System.Data.ConnectionState.Closed)
{
this.connection.Open();
}
}
}
}
public void Dispose()
{
if (this.connection != null)
{
this.connection.Close();
this.connection.Dispose();
}
}
}
すべてのSqlConnection
クラスは上記の基本クラスから継承し、各SqlConnection
使用箇所をusing
ブロックで囲みます
たとえば、Product
テーブルがあり、クラスProductAccess
を継承するとします。Access
次のコードを使用しています。
using (var acceess = new ProductAccess ())
{
Product product = acceess .GetProductById (id);
}
したがって、使用するたびにSqlConnection
新しいものを作成し、使用が終了したら破棄します(使用法がusing
ブロックで囲まれているため)
c# v4.0.30319 と Microsoft SQL Server 2008 R2 を使用しています。
このメモリリークが発生した理由を知っている人はいますか?
ガベージ コレクションの問題またはガベージ コレクションの構成に関連している可能性がありますか?
このリークGC.SuppressFinalize(this)
は、メソッドが呼び出すメソッド呼び出しに関連している可能性がありSqlConnection
dispose()
ますか?
ありがとう