.NET SQL连接泄漏

本文关键字:泄漏 连接 SQL NET | 更新日期: 2023-09-27 18:19:47

我为DB连接创建了一个类,如下所示:

public class DbHelper : IDisposable
{
private bool disposed;
public DbHelper()
{
    disposed = false;
}
public static SqlConnection ConnectionSender()
{
    var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbname"].ConnectionString);
    return conn;
}
public System.Int32 ExecuteNonQuerySender(SqlCommand cmd)
{
    System.Int32 result;
    using (var conn = ConnectionSender())
    {
        conn.Open();
        cmd.Connection = conn;
        result = cmd.ExecuteNonQuery();
    }
    return result;
}
~DbHelper()
{
    Dispose(false);
}
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
        }
    }
    disposed = true;
}
}

我将此类称为using方法:

var cmdParent = new SqlCommand { CommandText = sqlQuery };
using (var helper = new DbHelper())
{
            dt = helper.ExecuteNonQuerySender(cmdParent);
}

这很好用,但我的服务器过载了,我怀疑数据库泄漏了。DB连接对象应该关闭并在此代码中进行处理。我做错什么了吗?(以编程方式)我知道也有专业的方法来解决数据库连接,但我想试试这个代码。

.NET SQL连接泄漏

首先,看起来您没有给我们提供整个DbHelper类。您没有显示DataTableSender方法,但在您的示例中使用了它。

其次,假设DBHelper的其余部分没有任何意外,那么这个类中没有任何东西需要任何dispose逻辑。您可以完全删除IDisposable实现,以及终结器、Dispose方法和disposed变量,这不会有任何区别(除了允许您在使用类时删除using子句之外)。我建议您这样做,并将该类设置为静态类(需要同时将ExecuteNonQuerySender方法设置为静态)。

最后,这里没有任何泄漏连接的内容,但是,如果调用方调用ConnectionSender并且从未关闭/处理他们返回的连接,则它们可能是"泄漏"连接。

David M.Kean-MS Dev关于基类库团队:SqlConnection是个例外,等等,Close并不意味着与处置关闭将关闭连接,但允许重复使用相同的连接连接实例Dispose关闭连接,但不允许重复使用相同的连接例如";

斯蒂芬·克利里:;在Reflector中查看SqlConnection时,Close和Dispose不是相同的";

斯蒂芬·克利里:;我是个聪明人,但大卫在微软工作。源代码访问胜过所有其他知识。)"

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/b3587ccc-74e0-4575-9b60-7c529d2607ac

您不应该在SQLConnection上使用"using",处置会导致您的连接从连接池中删除,并可能影响性能

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/b3587ccc-74e0-4575-9b60-7c529d2607ac