我使用ADO.NET和SQL Server 2008完成了桌面应用程序。我计划通过本地网络在连接到Windows 7计算机上的SQL Server数据库的10台计算机上运行我的应用程序。
如果所有计算机同时运行,是否有任何问题?
那么SQL Server连接池呢?
请注意,当我尝试使用此命令在SQL Server上查找数据库的活动连接时:
sp_who
我找到了20多个活动连接。
这会导致问题吗?
答案 0 :(得分:0)
对于运行SQL Server的Windows 7:
似乎只允许来自其他设备的20个并发连接。(Source)但是,根据这20个设备上运行的应用程序,可能会启动更多连接,这可能会导致您见。
另外,请确保您正确关闭应用程序中的连接,并且不要让连接断开。
对于任何Windows Server操作系统,以下情况适用于您需要同时连接的情况:
来自How to: Set User Connections (SQL Server Management Studio) - MSDN
设置用户连接
在对象资源管理器中,右键单击服务器,然后单击“属性”。
单击“连接”节点。
在“连接”下的“最大并发连接数”框中,键入或选择0到32767之间的值以设置最大数量 允许同时连接到实例的用户 SQL Server。
- 醇>
重新启动SQL Server。
因此,最大连接数为32,767,这在SQL Server 2014中也是如此。
您也可以运行sp_configure
来获取当前的运行值。
答案 1 :(得分:0)
如果您只关注十个客户端,SQL Server应该能够处理它。
除此之外,这只是设计这种负载的问题。例如,您希望确保在正确的时间发生了正确的锁定。本质上,让多个并发客户端访问同一个数据库与在同一台机器上访问相同变量的多个并发线程相同。比起int
,数据库有点聪明,但是你仍然希望确保自己处理事情的发生。
例如,假设您有一个要完成的Tasks
表,并且它有ID
的列和LastCompleted
时的列。在单个客户端上,您可能希望编写一些可以访问它的内容:
LastCompleted < DATEADD(HOUR, -1, GETDATE())
UPDATE
要设置LastCompleted = GETDATE()
然后,您可以非常轻松地每小时完成所有任务。
但是,如果您遇到多个客户端访问,这将导致多个客户端多次抓取同一任务,并同时执行此操作。在这种情况下,您可能希望另一列指示InProgressAsOf
作为日期,然后您可以根据需要重试孤立的任务,但您永远不会冒重叠事件的风险。即便如此,您可能希望在OUTPUT
上使用UPDATE
子句来确保它们都是原子的。
UPDATE Tasks SET InProgressAsOf = GETDATE() OUTPUT DELETED.* WHERE LastCompleted < DATEADD(HOUR, -1, GETDATE()) AND InProgressAsOf < DATEADD(MINUTE, -10, GETDATE())
UPDATE
要设置LastCompleted = GETDATE()
但是,是的,只要您处于多线程操作的细微差别之上,就可以很好地针对同一个数据库运行十个并发连接。