2

可能重复:
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 的网站上选择了这个模式——只是选择了完全懒惰的版本,因为它听起来是最好的选择——但可能不是正确的。

4

2 回答 2

3

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

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

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

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

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

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

来源MSDN

于 2012-09-24T14:51:24.737 回答
2

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

从技术上讲,您不需要关心Connections打开的数量,只要它们与using:

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

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

于 2012-09-24T14:52:11.047 回答