SQL Server 2005 - закрытие спящих подключений

Кажется, у меня на моем Dev-сервере есть приложение с множеством открытых соединений (они должны быть там, но для их открытия использовался какой-то плохой слой данных, который забыл закрыть их). Я просто хочу, чтобы они были закрыты, чтобы другие приложения работали на сервере. Как я могу заставить все соединения закрыться?

15.12.2008 11:08:23
4 ОТВЕТА
РЕШЕНИЕ

Используйте следующий скрипт для уничтожения неактивных сеансов с определенного хоста / логина. Вы можете использовать его по расписанию, конечно же, вашим приоритетом должно быть исправление уровня приложения.

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 + ']';
5
15.12.2008 12:13:06

Помимо уничтожения ваших соединений вручную, вы можете

  • Утилизируйте соединения. То есть как-то получить объекты Connection и вызвать для них .Close и .Dispose (). Использование «using» было бы идеальным, поскольку оно автоматически вызывает .Dispose ().
  • Перезапустите свой пул приложений.
3
15.12.2008 11:13:18
Спасибо - у меня есть слой данных, который является одноразовым и уничтожает все соединения при утилизации, но по какой-то причине разработчик, работающий над этим приложением, решил не прекращать доступ к данным. Что вы подразумеваете под переработкой пула приложений?
digiguru 15.12.2008 11:16:41
Что ж, если это веб-приложение, работающее на IIS, вы можете время от времени перезагружать (= перезапускать) приложение IIS, что, очевидно, уничтожает все соединения. Если это не веб-приложение, вы не можете использовать этот подход. Это не специфичные для MSSQL решения, но, тем не менее, они уничтожат соединения.
Tamas Czinege 15.12.2008 11:22:50

Используйте столбец last_batch из sysprocesses, чтобы выяснить, действительно ли он активен или нет. SPID> 50 (или>> = 50?), Чтобы избежать уничтожения системных 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
3
15.12.2008 11:15:48

Сначала запустите это, чтобы найти базу данных нарушителя .....

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'

Затем запустите это, чтобы убить соединения с нужной БД

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
2
20.03.2009 21:28:57