有必要解构单例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"时,连接会关闭,.... .但是当我使用单例时,它存在于程序本身的整个运行时。为了在程序结束时关闭连接,是否有必要在那里创建一个"解构器"?

有必要解构单例sql连接吗?

当我们想要有一个工厂函数的东西,实现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结构将是最简单的方法。