Como liberar conexões fantasmas (inativas) do SQL Server 2005?
19 de outubro de 2010 1 Comentário
Como liberar conexões fantasmas (inativas) do SQL Server 2005?
Neste artigo não irei me aprofundar em explicação de conceitos de SQL, mas somente compartilhar uma solução para o problema que tive. Qualquer dúvida favor postar um comentário que eu respondo.
Há alguns dias atrás estava com um problema relacionado com pool de conexões no SQL Server. O cenário era uma aplicação web em asp.net que abria conexões e fechava normalmente porém por algum problema de comunicação entre o servidor de banco de dados e o de aplicação acarretava em conexões inativas no gerenciador de processos do SQL Server. Investigando possíveis situações que poderiam ocasionar este problema, encontrei um artigo que dizia que em alguns casos o gerenciador do SQL deixa conexão no pool se tiver algum problema de comunicação com cliente.
Após saber disto encontrei um artigo falando sobre as duas Stored Procedures que lista informações de processos que são:
- sp_who lista processos com informações básicas;
- sp_who2 lista processos com informações detalhadas;
Porém eu precisava acrescentar algumas condições, como: pegar somente conexões com status “sleeping”, de um usuário e que não tivesse nenhuma transação aberta. Sendo assim, fiz mais uma pesquisa para saber qual era a tabela que continha essas informações e então encontrei a SYS.SYSPROCESSES localizada no Banco de dados Master, por último faltava saber o comando que exclui processo e então o encontrei KILL.
Com todas as informações montei então o seguinte script para rodar na base de dados Master:
DECLARE @KILLSPIDPREZA VARCHAR(30) DECLARE KILL_PROC_PREZA CURSOR FOR SELECT 'KILL '+CAST(SPID AS VARCHAR) FROM SYS.SYSPROCESSES WHERE STATUS='SLEEPING' AND LOGINAME='Nome_desejado' AND OPEN_TRAN=0 OPEN KILL_PROC_PREZA FETCH NEXT FROM KILL_PROC_PREZA INTO @KILLSPIDPREZA WHILE @@FETCH_STATUS = 0 BEGIN EXECUTE (@KILLSPIDPREZA) FETCH NEXT FROM KILL_PROC_PREZA INTO @KILLSPIDPREZA END CLOSE KILL_PROC_PREZA DEALLOCATE KILL_PROC_PREZA
Crei um job no sqlServer para executar o script de 1 em 1 minuto e não tive mais problemas com conexões preza.
Lembrando que essa solução talvez não seja a melhor, mas para o momento foi a mais eficiente que encontrei para solucionar o problema em curto prazo.
Referências:
http://support.microsoft.com/kb/137983/pt-br (Conexões orfãos)
http://msdn.microsoft.com/en-us/library/ms173730.aspx (Comando KILL)
http://msdn.microsoft.com/en-us/library/ms174313.aspx (Stored Procedure sp_who)
http://msdn.microsoft.com/en-us/library/ms179881.aspx (Tabela sys.processes)
Versão do SQL Server: 2005