如何避免MSSQL中的“休眠”进程?

时间:2017-05-29 13:31:00

标签: c# sql .net sql-server database

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

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

是否有办法关闭/处置“睡眠”进程被杀死?

是否与我创建新的SqlConnections,打开它们并一直关闭它们有关?

我的流程如下:

发出请求:

  1. 我创建了一个连接到我的MSSQL数据库的新SqlConnection实例。
  2. 我调用存储过程,检索数据并将其呈现给用户。
  3. 我使用.Close();
  4. 关闭了连接
  5. 我为每个请求重复所有这些步骤。请求每5-10秒发生一次。 (有时更慢,有时更快)
  6. 我很抱歉如果这个问题缺少一些细节,但我希望这足以得到一些有用的答案。

    谢谢!

1 个答案:

答案 0 :(得分:0)

您需要使用SET XACT_ABORT ON或添加一些客户端回滚代码

当发生客户端超时事件(例如.net CommandTimeout)时,客户端向SQL Server发送“ABORT”。然后SQL Server简单地放弃查询处理。没有回滚任何事务,也没有释放锁。

现在,连接将返回到连接池,因此SQL Server上的连接未关闭。如果发生这种情况(通过KILL或客户端重启等),那么将清除事务+锁。请注意,sp_reset_connection不会清除它们,也不会清除它们,即使它是为了这样做而公布的

来自中止的碎屑会阻挡其他过程。

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

您可以在SSMS中验证这是打开2个查询窗口:

窗口1:

在菜单Query..Query Options中设置超时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