.NET SQL连接泄漏

时间:2012-01-09 17:03:59

标签: c# .net sql-server

我为这样的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);
}

这工作正常,但我的服务器超载,我怀疑数据库泄漏。应该关闭数据库连接对象并将其置于此代码中。我做错什么了吗? (编程) 我知道也有专业的方法来解决数据库连接,但我想尝试这个代码。

4 个答案:

答案 0 :(得分:4)

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

其次,假设DBHelper的其余部分没有任何意外,此类中的任何内容都不需要任何dispose逻辑。您可以完全删除IDisposable实现,以及终结器,Dispose方法和disposed变量,它将没有区别(除了允许您在使用类时删除using子句)。我建议这样做并使该类成为静态类(也需要使ExecuteNonQuerySender方法保持静态)。

最后,这里没有任何泄漏连接,但是如果他们调用ConnectionSender并且从不关闭/处置他们返回的连接,则调用者可能会“泄漏”连接。

答案 1 :(得分:3)

  

David M. Kean - 基础类库团队的MS Dev:“这个例外是SqlConnection ,等等,Close并不等同于   处置。关闭关闭连接,但允许您重复使用它   稍后通过调用Open来连接实例。 Dispose关闭   连接,但不允许您重用相同的连接   实例

     

Stephen Cleary:“在Reflector中查看SqlConnection,关闭和Dispose不是   相同的“

     Stephen Cleary:“我是一个聪明人(IMO),但David为微软工作。来源访问胜过所有其他知识。;”“

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

答案 2 :(得分:1)

按照这篇文章解决您的泄漏问题:http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

答案 3 :(得分:-3)

您不应该在SQLConnection上使用“using”,这将导致您的连接从连接池中删除并可能损害性能

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