none
Duvida sobre conexao com serviço RRS feed

  • Pergunta

  • pessoal, tenho um serviço wcf q eu chamo para realizar a autenticação do usuario no sistema web. contudo, as vezes(é intermitente) ele apresenta o seguinte erro e eu nao sei do que se trata. se alguem souber me ajudar com algum tipo de configuração no iis ou algo para resolver esse problema eu agradeço.

     

    System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached. (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:

    System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)

       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

       at System.Data.SqlClient.SqlConnection.Open()

       at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection()

       at Microsoft.Practices.EnterpriseLibrary.Data.Database.GetWrappedConnection()

       at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteScalar(DbCommand command)

       at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteScalar(String storedProcedureName, Object[] parameterValues)


    ----------------------------
    Bruno Seixas
    Analista de Sistemas
    sexta-feira, 18 de fevereiro de 2011 15:28

Todas as Respostas

  • Boas Bruno,

    Certifique-se de que você está finalizando (Dispose/Close) as conexões com o SQL Server depois que a utiliza.


    http://www.israelaece.com
    sexta-feira, 18 de fevereiro de 2011 23:23
    Moderador
  • Oi Israel, bom dia

    Desde quando postei essa duvida nao consegui simular novamente o erro. É muito intermitente.

    Quanto a fechar as conexoes com o sql, quando trabalho com o ExecuteReader eu efetuo o CLose e Dispose no IDataReader. Em métodos NonQuery faço como no codigo abaixo:

    private Database _defaultDb;
    
    _defaultDb = EnterpriseLibraryContainer.Current.GetInstance<Database>();
    
     _defaultDb.ExecuteNonQuery("proc", login, password);    
    

    A variavel DataBase da EnterpriseLibrary não contem os métodos de Close ou Dispose.

    Eu estou garantindo isso na finalização do serviço, com o método:

     private void TryCloseAuthenticationFacade()
      {
        if (_authenticationFacade == null)
          return;
    
        var client = _authenticationFacade as IClientChannel;
        if (client == null)
          return;
    
        try
        {
          if (client.State != CommunicationState.Faulted)
          {
            client.Close();
          }
        }
        catch
        {
          client.Abort();
        }
    
    
      }
    


    ----------------------------
    Bruno Seixas
    Analista de Sistemas
    quinta-feira, 24 de fevereiro de 2011 13:21
  • Boas Bruno,

    E não há nenhum outro sistema/recurso que está consumindo a base de dados? Já tentou monitorar nos contadores de performance do SQL Server para visualizar a quantidade de conexões?
    http://www.israelaece.com
    quinta-feira, 24 de fevereiro de 2011 19:11
    Moderador
  • Bruno, boa tarde.

     

    O connection pool mantém em cache no servidor uma certa quantidade de conexões para que possam ser reaproveitas em chamadas futuras, mesmo se você encerra a conexão em sua aplicação. Isso melhora a performance das aplicações, uma vez que a obtenção de uma nova conexão é muito custosa. Entretanto, existem algumas restrições para que essas conexões mantidas no pool possam gerar ganhos de performance. Outro ponto importante que esse pool pode ser configurado. Mas antes, recomendo entender como funciona o pool de conexões e, principalmente entender como a sua aplicação monta a string de conexão com o banco. 

    Recomendo a leitura do artigo do Nelson Basseto sobre o assunto:

    http://nelsonbassetto.com/blog/2010/09/quick-dev-connection-pooling/

     

     


    Alessandro Brito
    sábado, 26 de março de 2011 16:47