【问题标题】:Is there maximum connection limit to SQL ServerSQL Server 是否有最大连接限制
【发布时间】:2014-11-18 07:47:29
【问题描述】:
我使用 ADO.NET 和 SQL Server 2008 完成了我的桌面应用程序。我计划在 10 台计算机上运行我的应用程序,这些计算机通过本地网络连接到 Windows 7 计算机上的 SQL Server 数据库。
如果所有计算机同时运行有什么问题吗?
那么 SQL Server 连接池呢?
请注意,当我尝试使用此命令在 SQL Server 上查找我的数据库的活动连接时:
sp_who
我发现了 20 多个活动连接。
这会导致问题吗?
【问题讨论】:
标签:
c#
sql-server
sql-server-2008
ado.net
database-connection
【解决方案1】:
对于运行 SQL Server 的 Windows 7:
似乎只允许来自其他设备的 20 个同时连接。(Source) 但是,根据这 20 个设备上运行的应用程序,可能会启动更多连接,这可能会导致您看到的情况。
还要确保您在必要时正确关闭应用程序中的连接,而不是不必要地打开连接。
对于任何 Windows Server 操作系统,如果您对同时连接的需求更大,以下适用:
来自How to: Set User Connections (SQL Server Management Studio) - MSDN
设置用户连接
-
在对象资源管理器中,右键单击服务器并单击属性。
-
单击连接节点。
-
在“连接”下的“最大并发连接数”框中,键入或选择一个介于 0 到 32767 之间的值以设置最大连接数
允许同时连接到实例的用户数
SQL 服务器。
-
重新启动 SQL Server。
因此,最大连接数为 32,767,这在 SQL Server 2014 中是正确的。
您也可以运行sp_configure 来获取当前运行值。
【解决方案2】:
如果您只查看十个客户端,SQL Server 应该能够处理。
除此之外,只需针对这种负载进行设计即可。例如,您想确保在正确的时间发生正确的锁定。本质上,让多个并发客户端访问同一个数据库与让多个并发线程访问单台机器上的相同变量是一样的。该数据库比int 更智能一些,但您仍然需要确保自己掌握事情的发生方式。
例如,假设您有一个要完成的Tasks 表,它有一个ID 列和一个LastCompleted 时间列。在单个客户端上,您可能希望编写一些访问它的内容,如下所示:
- 获取下一个具有
LastCompleted < DATEADD(HOUR, -1, GETDATE())的
- 完成这项任务,需要 5 分钟
-
UPDATE要设置的表LastCompleted = GETDATE()
然后你可以很容易地每小时完成所有任务。
但是,如果您面对多个客户端访问,这将导致多个客户端多次抓取同一个任务,并同时执行。在这种情况下,您可能希望另一列将 InProgressAsOf 指示为日期,然后您可以根据需要重试孤立的任务,但您永远不会冒险发生重叠的事情。即使这样,您也可能希望在您的 UPDATE 上使用 OUTPUT 子句以确保它是原子的。
- 从
UPDATE Tasks SET InProgressAsOf = GETDATE() OUTPUT DELETED.* WHERE LastCompleted < DATEADD(HOUR, -1, GETDATE()) AND InProgressAsOf < DATEADD(MINUTE, -10, GETDATE())获取结果
- 完成这项任务,需要 5 分钟
-
UPDATE要设置的表LastCompleted = GETDATE()
但是,是的,只要您熟悉多线程操作的细微差别,您应该可以针对同一个数据库运行 10 个并发连接。