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