有必要解构单例sql连接吗?
本文关键字:sql 连接 单例 | 更新日期: 2023-09-27 18:13:12
通常我使用语句:
using (SqlConnection connection = new SqlConnection("Data ..."))
{
....
}
定义使用sql命令的区域。现在,对于特定的应用程序,我正在考虑将sql连接放入单例中,而不是上面的构造:
public class SimpleClass
{
// Static variable that must be initialized at run time.
public static SqlConnection singletonConnection;
// Static constructor is called at most one time, before any
// instance constructor is invoked or member is accessed.
static SimpleClass()
{
singletonConnection = new SqlConnection("Data Source.....");
}
}
我的问题是....通常当我使用"using"时,连接会关闭,.... .但是当我使用单例时,它存在于程序本身的整个运行时。为了在程序结束时关闭连接,是否有必要在那里创建一个"解构器"?
当我们想要有一个工厂函数的东西,实现IDisposable
我们使用Action
这样:
public class SimpleClass
{
public static void InvokeSql(Action<SqlConnection> func)
{
if (func == null)
{
throw new NullReferenceException("func");
}
using (SqlConnection connection = new SqlConnection("Data ..."))
{
connection.Open();
func(connection);
}
}
}
你现在可以像这样使用SqlConnection
public class Foo
{
public void Bar()
{
SimpleClass.InvokeSql((connection) =>
{
string sql = "DELETE [User]";
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.ExecuteNonQuery();
}
});
}
}
请考虑一下:如果您为连接使用单例,并且您得到连接错误(例如:connection lost…),谁处理(=close)断开的连接?所以如果你想坚持你的单例机制,我建议你使用一个带有close的"try-catch"block;语句
try
{
singletonConnection = new SqlConnection("Data Source.....");
}
catch (SqlException)
{
throw;
}
finally
{
singletonConnection.Close();
}
但是就像macr_S说的:使用using结构将是最简单的方法。