【发布时间】:2017-05-29 13:31:00
【问题描述】:
目前,当我连接到我的 MSSQL 数据库、调用存储过程、获取一些数据时,我遇到了很多服务器进程(从 sp_who2 看到)的问题,即“休眠”而不是完成(被删除)然后关闭连接。
在 C#/.NET 中连接 MSSQL 数据库、调用存储过程、从存储过程(数据读取器)检索数据然后关闭连接的最佳方式是什么?
有没有办法关闭/处置,以便“休眠”进程被杀死?
这和我创建新的SqlConnections,一直打开和关闭有关系吗?
我的流程如下:
请求发生:
- 我创建了一个连接到我的 MSSQL 数据库的新 SqlConnection 实例。
- 我调用存储过程,检索数据并将其呈现给用户。
- 我用
.Close();关闭连接 - 我为每个请求重复所有这些步骤。请求每 5-10 秒发生一次。 (有时慢,有时快)
对不起,如果这个问题缺少一些细节,但我希望这足以得到一些有用的答案。
谢谢!
【问题讨论】:
-
这是预期的行为——连接被池化,并且其中的一些始终保持可用,以最大限度地减少设置物理连接的开销。关闭连接并没有真正关闭它,它只是让它再次可供池使用。你遇到的“问题”是什么?活动会话的数量实际上是在增加,还是您只是认为有问题,因为这些会话完全存在?您的一般用法是正确的,但不是显式调用
.Close(),而是更喜欢using:即使面对异常也是安全的。 -
@JeroenMostert 我会将其作为答案发布,并添加指向有关主题 msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx的 msdn 文档的链接
-
我的假设是错误的,当有很多“休眠”进程时,数据库变得越来越慢,而当我试图清除这些“休眠”进程时,数据库变得更快。这只是巧合吗?
-
池连接将在几分钟未使用后物理关闭。将连接和命令包装在
using块中,以便它们自动关闭和释放。 -
应用程序是否使用集成安全性连接到数据库?检查上面链接上的“池碎片”部分。
标签: c# sql .net sql-server database