【发布时间】:2009-06-27 05:10:47
【问题描述】:
我读到.NET 使用连接池。
例如,如果我用相同的连接字符串实例化一堆 SqlConnection 对象,那么在内部 .NET 将知道使用相同的连接。
这是正确的吗?
另外,在一个基于 Web 的大型应用程序中,有什么技巧可以利用这种“力量”的最佳方式?
【问题讨论】:
标签: c# asp.net sql sql-server sql-server-2005
我读到.NET 使用连接池。
例如,如果我用相同的连接字符串实例化一堆 SqlConnection 对象,那么在内部 .NET 将知道使用相同的连接。
这是正确的吗?
另外,在一个基于 Web 的大型应用程序中,有什么技巧可以利用这种“力量”的最佳方式?
【问题讨论】:
标签: c# asp.net sql sql-server sql-server-2005
在您的 Web 应用程序和 SQL Server 之间建立 TCP 连接可能是一项昂贵的操作。连接池允许将与数据库的连接重新用于后续数据请求。不是在每个请求上都建立一个新的 TCP 连接,而是仅在连接池中没有一个连接时才建立一个新的连接。当连接关闭时,它会返回到池中,并在该池中保持与数据库的连接,而不是完全断开该 TCP 连接。
当您完成连接后,请务必关闭它们。无论任何人对 Microsoft .NET Framework 中的垃圾收集有何评论,当您完成连接后,请务必在连接上显式调用 Close 或 Dispose。不要相信公共语言运行时 (CLR) 会为您清理和关闭连接。 CLR 最终将销毁该类并强制关闭连接,但您无法保证对象上的垃圾回收何时真正发生。
要以最佳方式使用连接池,需要遵守一些规则。首先,打开连接,完成工作,然后关闭连接。如果必须,可以在每个请求上多次打开和关闭连接,而不是保持连接打开并通过不同的方法传递它。其次,使用相同的连接字符串(如果您使用集成身份验证,则使用相同的线程标识)。如果您不使用相同的连接字符串,例如根据登录用户自定义连接字符串,您将无法获得与连接池提供的相同优化值。而且,如果您在模拟大量用户的同时使用集成身份验证,那么您的池化效果也会大大降低。
.NET CLR 数据性能计数器在尝试跟踪与连接池相关的任何性能问题时非常有用。
【讨论】:
如果你使用下面的语法,只要留下 using 块,dispose 方法就会被调用,即使发生异常。
using(SqlConnection connection = new SqlConnection())
{
// Work with connection object here.
}
//connection object gets disposed here.
【讨论】:
不确定这是否完全相关,但我刚接手一个项目,发现原来的编程团队没有做一些非常重要的事情。
当你有一个 SQLConnection 时,我们称它为 conn,你可以这样做:
conn.Open();
然后执行一些 SQL 语句,无论是选择、插入还是更新。它完全有可能失败。所以当然,你应该这样做:
try { conn.Open() }
catch (SqlException ex)
{
//do your logging/exception handling
}
但是,人们忘记添加 finally 块。
finally {
if (conn.State == System.Data.ConnectionState.Open)
conn.Close();
}
您要确定是否存在连接未保持打开的异常,因此请确保将其关闭。
【讨论】: