增加最大池大小和性能

时间:2014-08-18 07:37:03

标签: sql asp.net sql-server connection-pooling

在我的ASP.net网站上,我连接到SQL Server Express数据库。有时我会遇到很多错误,比如

  

System.InvalidOperationException:超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。

在搜索错误后,我发现可能是由于未关闭的SQL Server连接。但我已经正确使用了SQL Server连接,并且我已正确处理它。我使用using语句来处理连接。在我的应用程序中,我在一天的某个高峰时间收到很多请求(连接到SQL Server数据库)。

所以我计划增加最大池大小。现在我没有在我的连接字符串中指定它。所以它将是100(默认)。我计划将它增加到20000,这样我就不会得到错误。

增加到这个数字的最大池大小会导致任何问题吗?增加最大池会导致任何性能问题吗?

编辑: 以下是我在代码

中使用Using的示例
Using con1 As New SqlConnection
    con1.ConnectionString = "" //conn string here
    con1.Open()
    doSomething()      
End Using 

Using con2 As New SqlConnection
                con2.ConnectionString = "" //conn string here
                con2.Open()
                doSomething()
            Using con3 As New SqlConnection
               con3.ConnectionString = "" //conn string here
               con3.Open()
               doSomething()       
            End Using

End Using 

Catch ex As Exception

End Try

修改 我刚刚通过在我的应用程序中将最大池大小设置为20000进行测试,以检查最大池是否确实导致了问题。我希望不再得到此异常。但它没有解决问题,也可能不是错误的原因。设置最大池后,我在3小时的持续时间内得到上述错误约50次。所以我怀疑它真的是由于游泳池大小?错误消息指出“可能已发生这种情况,因为所有池化连接都在使用中并且达到了最大池大小”。那么是否有其他情况显示相同的错误消息?请帮忙。

1 个答案:

答案 0 :(得分:2)

如果需要,可以增加池大小。有两个缺点:

  1. 更多连接意味着更多的资源使用。
  2. SQL Server的连接限制大约为30k连接。当你耗尽它时,你将失去可用性。
  3. 我建议更慢地走高。不要立即将池大小增加到20k。想想20k连接意味着什么:它意味着同时执行大约20k个线程(如果单个线程使用多个连接,则更少)。如果你在那个地方,你可能有负载问题。

    为什么你甚至需要那么多连接?对于Web应用程序,每个运行请求通常只有一个连接同时打开。对于大多数情况来说,几百个应该足够了。

    尝试缩短每个连接必须打开的持续时间。