这是以下问题的后续问题:是否需要解构单例sql连接? https://stackoverflow.com/questions/32645209/is-it-necessary-to-deconstruct-singleton-sql-connections
正如一些评论所说,使用单例进行 sql 连接而不是进行多次使用是糟糕的设计。
不过,令我感兴趣的是一种说法,即 using 变体的性能是better比单例变体。现在,正如我所说,我很清楚这是一个糟糕的设计(我知道单身人士的大多数优点和缺点......尤其是缺点)。但令我惊讶的是业绩声明。
通常我会想:在程序运行期间打开和关闭 sql 连接 100-1000 次应该比只执行一次性能要差。因此我的问题是:非单例变体的性能真的更好吗?如果是的话为什么?
单例示例:
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 (SqlConnection connection = new SqlConnection("Data ..."))
{
....
}
基本上答案很简单:
连接到数据库服务器通常由以下几个部分组成
耗时的步骤。物理通道,例如套接字或命名通道
必须建立管道,与服务器的初始握手必须
发生时,必须解析连接字符串信息,
连接必须由服务器进行身份验证,必须运行检查
加入当前交易,等等。在实践中,大多数
应用程序仅使用一种或几种不同的配置
连接。
这意味着在应用程序执行期间,许多
相同的连接将被重复打开和关闭。到
最小化打开连接的成本,ADO.NET 使用一种优化
称为连接池的技术。
您不应该将单例用作某种“性能加速器”,因为它不是它的用途。通过使用它来存储一个静态 SQL 连接,您将面临许多内存和连接问题。你应该如何关闭连接?你应该如何释放消耗的内存?当一个连接关闭时,您就为所有应用程序用户关闭了它。您打算如何重新采用这种方法?
“连接池”的基本含义是,即使您创建了许多连接SqlConnection
对象,只要它们与连接字符串不不同,就可以重用现有的连接。
可以找到一些详细信息there https://msdn.microsoft.com/en-us/library/8xx3tyca.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)