新手玩最好避免的东西;将连接实例添加到Singleton模式中

时间:2012-09-24 14:48:01

标签: c# design-patterns

  

可能重复:
  SqlConnection Singleton

这是当前的代码:

static SqlConnection CreateConnection() {
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
    return conn;
}

因为应用程序只需要一个打开的连接,我想将它移到这个设计模式中。如何将上述内容翻译成以下内容?

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 

我刚刚从Jon Skeet's site选择了这个模式 - 只是去了完全懒惰的版本,因为它听起来像是最好的选择 - 虽然可能不是正确的。

2 个答案:

答案 0 :(得分:3)

很少有情况适合单身人士模式。您必须确保强制需要一个且只有一个类实例的实例。通常你没有这个设计要求,但人们倾向于弥补这一点。

一旦完成工作单元,就应该立即释放连接。您不应该永久保持连接打开,因此将您的连接转换为单例将无助于改进您的应用程序设计。

连接池机制为您管理复杂性,因此您不必担心与打开和关闭连接相关的性能,因为这是通过设计进行优化的。

  

连接到数据库服务器通常包含几个耗时的步骤。必须建立物理通道,如套接字或命名管道,必须进行与服务器的初始握手,必须解析连接字符串信息,连接必须由服务器进行身份验证,必须运行检查以获取当前交易,等等。

     

实际上,大多数应用程序仅使用一种或几种不同的配置进行连接。这意味着在应用程序执行期间,将重复打开和关闭许多相同的连接。为了最小化打开连接的成本,ADO.NET使用称为连接池的优化技术。

     

连接池减少了必须打开新连接的次数。 pooler保持物理连接的所有权。它通过为每个给定的连接配置保持一组活动连接来管理连接。每当用户在连接上调用Open时,pooler将在池中查找可用连接。如果池连接可用,则将其返回给调用者,而不是打开新连接。当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是关闭它。一旦连接返回到池,就可以在下一个Open调用中重用它。

来源MSDN

答案 1 :(得分:2)

问题不在于singleton,在应用程序中保持一个开放连接会降低性能并且不会使用连接并发和连接池。

从技术上讲,只要Connectionsusing一起使用,您就不需要关心多少using (var connection = new SqlConnection("yourConnectionString")) {}

{{1}}

ADO.NET连接池会自动为您提供连接。