.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连接对象应该关闭并在此代码中进行处理。我做错什么了吗?(以编程方式)我知道也有专业的方法来解决数据库连接,但我想试试这个代码。
首先,看起来您没有给我们提供整个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