0

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()ますか?

ありがとう

4

1 に答える 1