我们的 C# 应用程序中出现严重的内存泄漏。我们隔离了所有可能的嫌疑人,发现是数据层SqlConnection
——导致内存泄漏。我们正在执行许多SqlConnection
请求。每秒大约 10 个请求。我们每天的泄漏量为 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
表并且 aProductAccess
继承了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()
方法调用?
谢谢