[dotNUG] IIS não limpa o pool de conexões do SQL Server

527 views
Skip to first unread message

João Paulo Rezende da Silva

unread,
Oct 14, 2010, 10:33:09 AM10/14/10
to dot...@googlegroups.com

Pessoal beleza? Espero que sim!

Estou com um probleminha com pool de conexões, não sei o que acontece com o IIS que ele não libera o pool.

Ao analisar o código de acesso a dados notei a ausência da implementação do IDisposable, já o fiz e inclui para que chamasse o método

ClearPool(SqlConnection) e assim limpe o pool de conexões. Engraçado que no ambiente de desenvolvimento ele limpar diretinho, porém quando o publico no IIS ele não limpa. Ele só limpa se eu reiniciar o ApplicationPool ou o serviço do IIS, pensei em diminuir o tempo de reciclagem do work mas isso vai fazer com que as pessoas logadas no sistema precisem logar novamente.

Alguém tem um "LUZ"??

 

Abraços

Jarbas Brito

unread,
Oct 14, 2010, 7:53:37 PM10/14/10
to dot...@googlegroups.com
E aí João Paulo, Blz?

Então,

Com base neste link =>
http://weblogs.asp.net/wallym/archive/2004/08/28/222184.aspx

e nisto:

ADO.NET 2.0 introduces two new methods to clear the pool:
ClearAllPools and ClearPool. ClearAllPools clears the connection pools
for a given provider, and ClearPool clears the connection pool that is
associated with a specific connection. If there are connections in use
at the time of the call, they are marked appropriately. When they are
closed, they are discarded instead of being returned to the pool.

Se você chamar ClearPool(connection), ele vai limpar o pool dessa
conexao, já se você mandar o ClearPoolAll() ele zera tudo.


Caso não seja isso, tenta ver a configuração do teu IIS de produção.


Outra coisa, onde você faz o dispose do teu objeto? implementar por
implentar não adianta nada, tem que saber quando ele é chamado. Se vc
tiver usando using(var conn = new SqlConnection) por exemplo, ele faz
o dispose "automatico".


[]s

Em 14/10/10, João Paulo Rezende da Silva<joaop...@gmail.com> escreveu:

> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "dotNUG -
> .NET User Group" dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para dot...@googlegroups.com.
> Para cancelar a inscrição nesse grupo, envie um e-mail para
> dotnug+un...@googlegroups.com.
> Para obter mais opções, visite esse grupo em
> http://groups.google.com/group/dotnug?hl=pt-BR.
>
>


--
*Jarbas B. M. Segundo*
Blog: http://www.jsegundo.com.br
Skype : jbmsegundo

João Paulo Rezende da Silva

unread,
Oct 15, 2010, 8:11:07 AM10/15/10
to dot...@googlegroups.com
Eae Jarbas, tirando os pepinos... tá td blz! E contigo?
Então, eu implementei o IDispose desta forma:

 ~FGFMDb()
        {
           

            Dispose(false);

        }

//Só será chamado se eu der um dispose manual no objeto....
 public void Dispose()
        {
            Dispose(true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }


private void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if (!this.disposed)
            {

                SqlConnection.ClearPool(objConnection);
            
                // If disposing equals true, dispose all managed
                // and unmanaged resources.
                if (disposing)
                {
                    // Dispose managed resources.
                    objConnection.Dispose();
                }


                disposed = true;

            }
        }

Possui um destrutor na classe de acesso a dados que chama o dipose passando um valor falso no parâmetro!!
Ele já está caindo dentro Dispose e limpando o pool de conexão!
O que está me deixando intrigado é o fato de no ambiente de desenvolvimento ele realizar a limpeza direitnho!!!
No IIS acredito que esteja configurando direitinho, o que teria de configurações no IIS que poderia estar prendendo essas conexões??

Abraçoss

J.P.

Nelson Rodrigo

unread,
Oct 15, 2010, 8:16:15 PM10/15/10
to dot...@googlegroups.com

Olá pessoal!

 

Escrevi sobre connection pooling há algum tempo. Falo sobre como manipular o pool através da connection string (MaxPoolSize, MinPoolSize, ConnectionLifeTime e Pooling) e através do objeto de conexão (ClearAllPools, ClearPool e ReleaseObjectPool). Também falo sobre com o pool é dividido (processo, application domain e connection string).

 

Caso tenham interesse, segue o link: http://nelsonbassetto.com/blog/2010/09/quick-dev-connection-pooling/

 

 

Abraços

 

Nelson R L Bassetto

http://nelsonbassetto.com/

João Paulo Rezende da Silva

unread,
Oct 18, 2010, 3:50:40 PM10/18/10
to dot...@googlegroups.com
Nelson, obrigado pelo link fornecido, gostei da sua explicação!
Eu já estava utilizando o ClearPool(Sqlconnection obj) para limpar o pool e em desenvolvimento ele limpava, mas em produção não estava limpando e ficava com conexão inativa e preza no Sql Server;
Pesquisando na internet li um post da microsoft que dizia que as vezes o servidor de App pode não avisar o de B.D. e assim ocasionar essa fila de conexões inativas no pool... segue link: http://support.microsoft.com/kb/137983/pt-br
 Como alternativa implementei um script e criei um Job para executar o mesmo de 1 em 1 minuto verificando conexão inativa do user que uso para conectar e se não tem transação, atendendo aos requisitos ele pega o SPID e efetua um KILL no mesmo. Parou de ficar conexões preza no servidor e agora consegui tempo para continuar minha outras tarefas de desenvolvimento :-)
Segue código:

DECLARE @KILLSPIDPREZA VARCHAR(30)

DECLARE KILL_PROC_PREZA CURSOR FOR
SELECT 'KILL '+CAST(SPID AS VARCHAR) FROM SYS.SYSPROCESSES
WHERE STATUS='SLEEPING' AND LOGINAME='<USER_CONNECTION>' 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

Espero as críticas para melhorar solução.. :-)
Abraços e obrigado,

J.P.

Em 16 de outubro de 2010 16:48, João Paulo <joaop...@gmail.com> escreveu:

 

 


Reply all
Reply to author
Forward
0 new messages