.NET中的SqlConnection - 如何才能最好地利用连接池?

Bri*_*ter 2 c# sql sql-server asp.net sql-server-2005

我读到.NET使用连接池.

例如,如果我使用相同的连接字符串实例化一堆SqlConnection对象,那么内部.NET将知道使用相同的连接.

它是否正确?

此外,在一个基于网络的大型应用程序中,有关利用这种"力量"的最佳方法的任何提示?

Rob*_*vey 13

在Web应用程序和SQL Server之间建立TCP连接可能是一项昂贵的操作.连接池允许重新连接数据库以用于后续数据请求.不是在每个请求上设置新的TCP连接,而是仅在连接池中没有连接时才建立新连接.当连接关闭时,它将返回到池中,它将保持与数据库的连接,而不是完全拆除TCP连接.

完成后,请务必关闭连接.无论人们如何评论Microsoft .NET Framework中的垃圾收集,总是在完成连接时显式调用Close或Dispose.不要相信公共语言运行库(CLR)来清理和关闭您的连接.CLR最终将销毁该类并强制关闭连接,但是您无法保证何时实际发生对象上的垃圾收集.

要以最佳方式使用连接池,需要遵循一些规则.首先,打开连接,完成工作,然后关闭连接.如果必须,可以在每个请求上多次打开和关闭连接,而不是保持连接打开并通过不同的方法传递它.其次,使用相同的连接字符串(如果使用集成身份验证,则使用相同的线程标识).如果不使用相同的连接字符串,例如,根据登录用户自定义连接字符串,则不会获得连接池提供的相同优化值.如果您在模拟大量用户时使用集成身份验证,那么您的池化效率也会大大降低.

尝试跟踪与连接池相关的任何性能问题时,.NET CLR数据性能计数器非常有用.

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

  • @Robert,很好的答案,但我希望你能添加一个快速的代码示例,显示一个"using"语句来打开(以及后来的Dispose)连接. (2认同)

Rub*_*ord 9

如果使用以下语法,则只要剩下using块,即使发生异常,也会调用dispose方法.

using(SqlConnection connection = new SqlConnection())
{
    // Work with connection object here.
}

//connection object gets disposed here.
Run Code Online (Sandbox Code Playgroud)