2017-05-29 71 views
1

目前我遇到了很多服务器进程问题(从sp_who2中看到)“睡眠”,而不仅仅是,完成(被删除),当我连接到我的MSSQL数据库,调用存储过程,获取一些数据和然后关闭连接。如何避免MSSQL中的“睡眠”进程?

在C#/ .NET中连接到MSSQL数据库,调用存储过程,从存储过程(数据读取器)检索数据,然后关闭连接的最佳方式是什么?

有没有办法关闭/处置,使“睡眠”进程被杀害?

它与我创建新的SqlConnections,打开它们并关闭他们有什么关系吗?

我的流程如下:

请求发生:

  1. 我创建了一个新的SqlConnection实例连接到我的MSSQL数据库。
  2. 我调用一个存储过程,检索数据并将其呈现给用户。
  3. 我关闭连接.Close();
  4. 我重复所有这些步骤为每个请求。请求每5-10秒发生一次。 (有时更慢,有时更快)

对不起如果这个问题缺少一些细节,但我希望这足以得到一些有用的答案。

谢谢!

+3

这是正常现象 - 连接池和其数量始终保持可用,以最大限度地减少设置物理连接的开销。关闭连接并不会真的关闭它,它只是让它再次可用于池。你遇到的是什么“问题”?活动会话的数量是否真的在增加,或者您是否认为存在错误,因为这些会话都存在?您的一般用法是正确的,但不是明确调用'.Close()',而是''使用':即使面对异常,这也是安全的。 –

+0

@JeroenMostert我会张贴它作为答案,添加一个链接到msdn文档的主题https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx – bradbury9

+0

我的假设有些事情是错误的,就是当很多“睡眠”进程中,数据库变得越来越慢,当我试图清除这些“睡眠”进程时,数据库变得更快。这只是一个假设吗? –

回答

0

你需要使用SET XACT_ABORT ON或当客户端超时事件发生(.NET的CommandTimeout例如),客户端发送一个“中止”到SQL Server添加一些客户端代码回滚

。 SQL Server然后简单地放弃查询处理。没有事务回滚,没有锁被释放。

现在,连接返回到连接池,所以它不会在SQL Server上关闭。如果发生这种情况(通过KILL或客户端重新启动等),那么交易+锁将被清除。请注意,sp_reset_connection不会或不会清除它们,即使它被广告这样做

来自中止的碎片会阻止其他进程。

使SQL Server清除客户端超时(严格来说,ABORT事件)事务+锁定的方法是使用SET XACT_ABORT ON。

您可以验证这一点可以在SSMS出口2个查询窗口:

窗口1:

在菜单查询..查询选项设置为5秒的超时然后运行这个

BEGIN TRAN 
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0; 
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout 

窗口2,这将永远等待(或打你超时)

SELECT * FROM sometable