释放 SQL 连接
本文关键字:连接 SQL 释放 | 更新日期: 2023-09-27 18:31:01
我有一个连接到数据库并检索数据表的SQL类。我知道 SqlConnection 必须在完成后处理掉。我知道这可以使用 using
块来完成,但是将 Dispose()
调用放在此类的析构函数中也可以接受吗?
Herre是我的代码:
public class SQLEng
{
//Connection String Property
//Must be set to establish a connection to the database
public string ConnectionString{ get; set; }
SqlConnection _Conn;
//Overridden Constructor enforcing the Connection string to be set when created
public SQLEng(string connectionString)
{
ConnectionString = connectionString;
_Conn = new SqlConnection(connectionString);
}
//ensure the SqlConnection is disposed when destructing this object
public ~SQLEng()
{
_Conn.Dispose();
}
//various other methods to get datatables etc...
}
基本上,我希望有一个类变量 SqlConnection,而不是在每个访问数据库的方法中实例化 SqlConnection。这是合理的做法吗?
你的设计鼓励长时间坚持一个(大概是开放的)SqlConnection
。最佳做法是在需要连接之前打开连接,然后在完成后立即释放(关闭并处置)它。
是的,创建新连接会产生一些开销;连接池可以减轻大部分处理时间。更糟糕的是使服务器上的许多连接保持活动状态。
查看企业库的源代码(来自 MS 模式和实践团队),DAAB 根据需要创建连接并尽快释放它。
public virtual int ExecuteNonQuery(DbCommand command)
{
using (var wrapper = GetOpenConnection())
{
PrepareCommand(command, wrapper.Connection);
return DoExecuteNonQuery(command);
}
}
protected DatabaseConnectionWrapper GetOpenConnection()
{
DatabaseConnectionWrapper connection = TransactionScopeConnections.GetConnection(this);
return connection ?? GetWrappedConnection();
}
所以我想说这是一种最佳做法。在大多数情况下,您所做的只是将连接返回到连接池,因此连接本身实际上并没有关闭。
如果您希望包装 SQL 连接类,请实现 IDisposable 并从您自己的 Dispose() 方法中调用连接 Dispose()。更多信息在这里:
正确处置数据库连接
至于这是否是好的做法 - 好吧,如果你所做的一切都是将SQL连接包装在另一个类中,我不确定你实现了什么。所有方法仍然需要访问此类的实例,在这种情况下,它们可以单独访问连接对象的实例。