在我的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
EDIT: 我刚刚通过在我的应用程序中将最大池大小设置为20000进行测试,以检查最大池是否真的导致问题 . 我原本期望不再得到此异常 . 但它没有解决问题,也可能不是错误的原因 . 设置最大池后,我在3小时的持续时间内得到上述错误约50次 . 所以我怀疑它真的是由于游泳池大小?错误消息指出"This may have occurred because all pooled connections were in use and max pool size was reached" . 那么是否有其他情况显示相同的错误消息?请帮忙 .
1 回答
如果需要,可以增加池大小 . 有两个缺点:
更多连接意味着更多的资源使用 .
SQL Server的连接限制大约为30k连接 . 当你耗尽它时,你将失去可用性 .
我建议走得更慢 . 不要立即将池大小增加到20k . 想想20k连接意味着什么:它意味着同时执行大约20k个线程(如果单个线程使用多个连接,则更少) . 如果你在那个地方,你可能有负载问题 .
为什么你甚至需要那么多连接?对于Web应用程序,每个运行请求通常只有一个连接同时打开 . 对于大多数情况,几百应该足够了 .
尝试缩短每个连接必须打开的持续时间 .