我的工作场所有销售人员使用直接连接 Sql Server 的 3rd 方桌面应用程序,该软件为每个用户留下数百个休眠连接。无论如何以编程方式清除这些连接?
Chris Canal
问问题
8493 次
2 回答
2
您运行哪个版本的 SQL Server?您可以编写一个存储过程来执行此操作,查看来自 sp_who 的数据,然后对最后一个活动进行一些猜测。有一个“LastBatch”列表示该用户最后一次提交的内容。我会说如果那超过一个小时(或任何时间间隔),请为该 SPID 执行 KILL。
您可以像这样在 SQL 2005 中执行此操作:
declare @spid int
, @cmd varchar(200)
declare Mycurs cursor for
select spid
from master..sysprocesses
where status = 'sleeping'
and last_batch > dateadd( s, -1, getdate())
open mycurs
fetch next from mycurs into @spid
while @@fetch_status = 0
begin
select @cmd = 'kill ' + cast(@spid as varchar)
exec(@cmd )
fetch next from mycurs into @spid
end
deallocate MyCurs
于 2008-09-17T13:48:54.497 回答
1
但是,与其手动杀死这些进程,难道不应该有办法避免这些吗?我在一个项目中遇到了同样的问题
在我们的 Web 应用程序中,我们正在使用 Web 服务执行一些更新(即程序调用 Web 服务方法。该方法打开连接,执行更新,提交并使用 connection.close() 关闭连接)
在 sqlserver mgmt 工作室中,如果我执行 sp_who2,我会看到连接随着应用程序的运行而增加 - 事实上,每次更新执行的速度为 1 个连接。并且有关的部分是它越过 100,然后不允许更多连接到数据库。用户无法登录以及程序失败,因为他们无法获得更多新连接。
如何确保连接被重用——我们没有写任何连接池代码,使用默认的asp.net和Sqlserver连接池。为什么连接没有被重用,为什么它们在“关闭”后没有消失?这是否取决于 web 服务正在处理事务的事实?
非常感谢
于 2009-05-01T12:46:23.327 回答