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连接池,那么看起来我就处于非常安全的状态。。。