Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新手玩的东西可能是最好避免的;将连接实例添加到单例模式中_C#_Design Patterns - Fatal编程技术网

C# 新手玩的东西可能是最好避免的;将连接实例添加到单例模式中

C# 新手玩的东西可能是最好避免的;将连接实例添加到单例模式中,c#,design-patterns,C#,Design Patterns,可能重复: 这是当前代码: static SqlConnection CreateConnection() { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString); return conn; } 因为应用程序只需要一个打开的连接,所以我想将它转移到这个设计模式中。如何将上面的内容转换为下面的内容 public sealed

可能重复:

这是当前代码:

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();
    }
} 

我刚从中选择了这个模式——刚选择了完全懒惰的版本,因为它听起来像是最好的选择——但可能不是正确的模式。

如果采用单例模式,则很少有情况。您必须确保一个类实例的一个且仅一个实例是必需的。通常你没有这个设计要求,但人们倾向于弥补它

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

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

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

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

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


Source

问题不在于
单例
,在应用程序中保持一个打开的连接会降低性能,并且不会利用连接并发性和连接池

从技术上讲,只要与
using
一起使用,您就不需要关心打开了多少
连接:

using (var connection = new SqlConnection("yourConnectionString"))
{}

ADO.NET连接池将自动为您处理连接。

为什么只为了引入单例而引入单例?当您需要2个连接时,您会怎么做?注意
时的
。在某个时刻,您将需要第二个连接。Singleton’s指的是当只有一个时,这里不是这样。@Arran-你能解释一下这个评论吗?@Oded-这不是更好的做法吗?但是看看答案,只要我通过
使用
使用ADO连接池,那么看起来我就处于非常安全的状态。。。