最大连接池上限为100


27

我在Windows Server 2008机器上运行SQL Server 2008 R2 SP1。我有一个从Visual Studio 2010运行的.NET脚本,它执行以下操作:

  • 到达数据库
  • 做出改变
  • 迭代

迭代的总次数为150,但是它在100个连接处停止,我不知道为什么。我可以将脚本调整为仅使用一个线程,但是我想知道我在哪里缺少最大连接设置,因为这对于以后的参考更为有用。

到目前为止,这是我检查过的地方:

  • Visual Studio 2010中的SQL连接字符串(设置为1000)
  • SSMS数据库实例连接属性(设置为0 [infinity]用户连接)
  • Google在Server 2008上搜索了一些信息,看起来它可以处理100多个连接
  • 逐步浏览我的代码,SP_WHO2其中提供了有关逻辑连接的更多信息,看到连接数从52开始,脚本错误和“达到最大池连接数”错误在152逻辑连接。
  • 更改了要使用的连接字符串 Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

我不确定其他地方是否需要检查,我知道我在这里有很多活动部件,但是我感到自己只是在某个地方缺少最大泳池设置。


1
您可以发布连接字符串吗?请看我的回答。那应该是您的补救方法(此值将在连接字符串中指定。 System.Data.SqlClient默认值为100,这就是为什么看到连接池已用尽的原因)。
托马斯·斯金格

Answers:


24

默认情况下,SQL Server最多允许32767个连接。可以使用更改它sp_configure。要查看此设置的当前配置,请使用以下查询:

select * from sys.configurations
where name ='user connections'

默认情况下,您应该看到最多32767,value_in_use等于0(使用默认设置)。如果更改了此设置,则可以按照链接中的说明将SQL Server重新配置为使用其他值。

您还应该检查实际建立了多少个连接,因为在应用程序外部可能有更多的活动(或者您的应用程序进行的连接超出了您的想象)。您需要查看perfmon中的General Statistics-> Logical Connections 或查询中的值sys.dm_os_performance_counters(cntr_value将显示当前时间点值):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

是的,我已经检查了用户连接(这是我要做的第一件事,并且在UI和Microsoft文档中都最容易找到。我也逐步浏览了代码,并关注通过SSMS进行的逻辑连接的数量。使用SP_WHO2,这给信息像样的数目有关逻辑连接的空转,我的服务器有51个连接,当脚本失败,它已建立100多个连接的是如何我已经得到了我现在身在何处。
肖恩·朗

我通过采取的步骤进一步澄清了我的问题。它可能根本不是SQL中的设置,这就是为什么我开始查看Windows和Visual Studio设置的原因。
肖恩·朗

1
如果您已检查所有内容,但仍然无法通过100个连接进行连接,则答案不在数据库设置之内。仅供参考,这51个连接都是系统进程(您自己为+1)。
Mike Fal 2013年

只是为了提供某种封闭,最后的评论最终是正确的。我仔细研究了为什么要创建这100个连接,并发现代码中有泄漏。修复后,它可以正常工作。以上信息仍然非常有用,我希望其他人也会发现它也有用。
肖恩·朗

25

在连接字符串中,指定max pool size=<your desired max pool size>。因此,换句话说,如果要将最大池大小更改为值500,则连接字符串可能类似于以下内容:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

显然,我对您的其他参数承担了很多责任,但这应该可以使您更好地进行下一步。连接池是客户端提供程序强制实施。客户端将需要通过连接字符串指定此最大池大小设置。

另外,请确保正确关闭或处置连接,否则将束缚连接。像这样的东西(C#):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

using块(在C#中)IDisposable.Dispose()在完成时调用。您也可以在一个块中实现SqlConnection.Dispose()SqlConnection.Close()finally一个try/catch/finally块中。

参考: 有关SqlConnection.ConnectionString属性的MSDN文档


这是连接字符串,也更新了我的问题。Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
肖恩·朗

3
您的连接字符串到处都是吗?我问的原因是因为不同的连接字符串将成为不同的连接池。
托马斯·斯金格

这是一个非常非常好的问题。到目前为止,我检查了3个连接字符串,但是它们都在努力争取最大的最大缓冲池。我将看看是否可以找到其他可能导致它的字符串。
肖恩·隆

如果仅调试执行,则应该能够查看SqlConnection.ConnectionString特定操作的运行时值。那将是最简单的方法。如果max pool size不存在,则为100。
托马斯·斯金格

1
应该将其标记为已接受的答案,因为它实际上可以正确回答OP。他提到客户端conn字符串“最大池大小”参数和关闭/处置连接的需求。
亚当·卡维尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.