我似乎在我的開發服務器上有一個應用程序,它有很多開放連接(它們應該在那裏,但是一些不良數據層被用來打開它們,忘記關閉它們)。我只是想讓它們關閉,這樣我就可以讓其他應用程序在服務器上運行。我如何強制所有連接關閉?SQL Server 2005 - 關閉睡眠連接
2
A
回答
5
使用以下腳本從特定主機/登錄中終止非活動會話。你可以從預定的工作中使用它,當然你的優先級應該是修復你的應用層。
SET NOCOUNT ON;
DECLARE @host VARCHAR(50), @login NVARCHAR(128);
SET @host = 'fooHost'; --NULL to kill sessions from all hosts.
SET @login = 'fooLogin';
DECLARE @cmd NVARCHAR(255);
DECLARE @possition INT, @total INT, @selSpid SMALLINT;
DECLARE @spidInfo TABLE
(
[id] INT IDENTITY(1,1),
spid SMALLINT,
loginame NVARCHAR(128)
);
INSERT @spidInfo(spid, loginame)
SELECT session_id, login_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND [status] = 'sleeping' AND
login_name = @login AND [host_name] = COALESCE(@host, [host_name]);
SELECT @total = @@IDENTITY, @selSpid = 0, @possition = 0;
WHILE @possition < @total
BEGIN
SELECT TOP 1 @selSpid = spid, @possition = [id]
FROM @spidInfo
WHERE [ID] > @possition
SET @cmd = N'KILL ' + CAST(@selSpid AS NVARCHAR(10));
EXEC sp_executesql @cmd;
PRINT 'SessionId = ' + CAST(@selSpid AS NVARCHAR(10)) + '[' + @login +
'] killed by ' + system_user + ' at ' + CAST(GETDATE() AS VARCHAR(50));
END;
IF (@total = 0)
PRINT 'No sessions owned by user ' + '[' + @login + ']';
3
除了手動殺死你的連接,可以
- 連接的處置。也就是說,以某種方式檢索Connection對象並在它們上調用.Close和.Dispose()。使用「使用」將是理想的,因爲它會自動調用.Dispose()。
- 回收您的應用程序池。
3
使用sysprocesses中的last_batch列來判斷它是否真的有效。 SPID> 50(或> = 50?)以避免殺死系統SPID。
將此與您想要的睡眠時間和KILL spid進行比較。
你必須循環。
DECLARE @kill_id smallint
DECLARE spid_cursor CURSOR FOR
select spid from sysprocesses
where dbid = > 4 and last_batch < dateadd(hour, -24, getdate()) and spid >= 50
OPEN spid_cursor
FETCH NEXT FROM spid_cursor INTO @kill_id
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- Kill the current spid here
-- KILL @kill_id <---This line will not work
-- Get the next cursor row
FETCH NEXT FROM spid_cursor INTO @kill_id
END
CLOSE spid_cursor
DEALLOCATE spid_cursor
2
首先運行此找到有問題的數據庫.....
SELECT DB_NAME(dbid) as 'Database Name',
COUNT(dbid) as 'Total Connections'
FROM master.dbo.sysprocesses WITH (nolock)
WHERE dbid > 0
GROUP BY dbid
SELECT @@MAX_CONNECTIONS AS 'Max Allowed Connections'
然後運行這個殺人所需DB連接
USE master
go
DECLARE @dbname sysname
SET @dbname = 'Events'
DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
相關問題
- 1. 睡眠連接在SQL Server中
- 2. NodeJS - SQL Server連接關閉
- 3. 實體框架4不關閉sql server 2005 profiler中的連接
- 4. 關閉睡眠模式?
- 5. 連接到SQL Server 2005
- 6. Ruby連接到SQL Server 2005
- 7. SQL Server 2005連接問題
- 8. C#和SQL Server 2005連接
- 9. SQL Server 2005未連接
- 10. SQL SERVER 2005連接問題
- 11. SQL Server 2005與MySQL連接
- 12. SQL Server 2005遠程連接
- 13. SQL Server全局睡眠
- 14. Tomcat的不關閉連接,仍然在睡眠模式下
- 15. Java ConnectionPool連接沒有關閉,陷入'睡眠'
- 16. 15000連接到SQL Server 2008在「睡眠」狀態
- 17. 超過100個連接到SQL Server 2008的「睡眠」狀態
- 18. PHP,MySQL和「睡眠」連接
- 19. 休眠SQL Server連接
- 20. MS SQL Server和JDBC:關閉連接
- 21. 打開和關閉連接到SQL Server
- 22. .NET SQL Server連接過早關閉
- 23. 線程睡眠連接
- 24. 睡眠連接(mysql)mcrypt
- 25. 許多睡眠httpd連接
- 26. 運輸級錯誤:SQL Server在Windows睡眠模式下丟失連接(由遠程主機強行關閉)
- 27. 強制關閉SQL連接
- 28. SQL Server連接池不檢測關閉的連接?
- 29. 未關閉連接 - 連接池調試SQL Server
- 30. 春季啓動mysql睡眠連接
謝謝 - 我有一個數據這個層是一次性的,並且殺死了所有的處理連接,但由於某種原因,開發者在這個應用程序上工作時決定不殺死數據訪問。回收應用程序池是什麼意思? – digiguru 2008-12-15 11:16:41
這與SQL Server連接無關...... – gbn 2008-12-15 11:16:45