Pergunta

durante beta teste descobrimos o pool de conexão mensagens de erro. Portanto, tenho vindo a atravessar o código e fechar o SqlDataReader objetos onde quer que eles foram deixados não fechada. O que eu preciso saber é como fechar uma datareader (ou se há uma necessidade em tudo para fechar) que está especificado no atributo SelectStatement das tags SqlDataSource ou ObjectDataSource. Poderia haver vazamento de conexão, se não forem tratadas?

Agradecemos antecipadamente!

Foi útil?

Solução

I tendem a usar a "utilizar" palavra-chave, especialmente quando se trata de abrir e fechar conexões a um banco de dados. "Usando" é um atalho para o padrão de Descarte - aqui é um link para o writeup MSDN e aqui é um link para uma entrada de blog útil com uma visão geral.

Outras dicas

Para melhorar o desempenho de Close () / Dispose () considerar chamar Cancelar () no objeto de comando associado antes de descartar ou fechar o leitor, especialmente quando você não chegar ao final do conjunto de registros.

Por exemplo:

            using (var cmd = ... ))
            {
                using (var reader = (DbDataReader) cmd.ExecuteReader())
                {
                    try
                    {
                        ConsumeData(reader); // may throw
                    }
                    catch(Exception)
                    {
                        cmd.Cancel();
                        throw;
                    }
                }
            }

O meu entendimento é que, com SqlDataSource, gerenciamento de conexão é feita para você, e você não tem nada a temer.

ObjectDataSource não falar com o banco de dados diretamente, em primeiro lugar, por isso vai ser seguro -., Desde que o objeto subjacente realiza sua conexão e gestão leitor corretamente

Como já foi mencionado, Close() e using são seus amigos para as classes que você usa com ObjectDataSource.

Meu palpite é que se você tiver limpo a base de código de forma eficaz, você já deve ter erradicado o problema.

Nós tivemos os mesmos problemas aqui em um ambiente de produção.

Resolvido o problema. O primeiro problema foi, não houve usando instruções em tudo no meu código. (Foi construído há alguns anos, com outros menos conhecimento).

Então eu tentei colocar o SqlDataSource em uma cláusula usando. Mas isso não quer ajudar.

O truque aqui é, como tvanfosson e Mischa estão sugerindo, colocando o leitor em uma cláusula usando. Este é o objeto que realmente fecha a conexão.

O número de conexões encolheu para o tamanho do conjunto mínimo de 10 na carga média.

Chamando .Dispose () deve lidar com a limpeza e liberar quaisquer recursos mantidos, mas o . close () método deve ser recebendo chamado, bem como quando um objeto é feito a leitura do leitor .

Eu acredito que o SqlDataSource vai lidar com seu próprio problemas de conexão / leitor, por isso não há preocupações. Quanto a suas conexões manuais, eu encontrei este padrão útil no passado:

   using (SqlConnection connection = new SqlConnection(connectionString))
   {
      try
      {
         SqlCommand command = connection.CreateCommand();
         command.CommandText = ...

         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader())
         {
            do
            {
               while (reader.Read())
               {
                  ... handle each row ...
               }
            } while (reader.NextResult());
         }
      }
      catch (Exception ex)
      {
          ... error handling ...
      }
      finally
      {
         if (connection != null && connection.State == ConnectionState.Open)
         {
            connection.Close();
         }
      }
  }

Eu concordo, que para o ObjectDataSource o fechamento deve ser tratado pelo seu Select método. Meu ObjectDataSource Select método retorna uma SqlDataReader. Minha preocupação é ... será o SqlDataReader ser inútil quando fechado depois de voltar para a interface do usuário. por exemplo. ver o código de exemplo a seguir. Eu não tentei isso e não quero fazê-lo nesta fase de desenvolvimento.

SqlDataReader MySelectMethod(){
   SqlDataReader dr = null;
   try{
      dr = DBObject.GetDataReader();
      return dr;
   }
   finally{
      dr.Close();
   }
}

Obrigado por todas as entradas recebidas até agora!

...........

O meu entendimento é que, com SqlDataSource, gerenciamento de conexão é realizada para você, e você tem nada a temer.

ObjectDataSource não falar com o banco de dados diretamente, em primeiro lugar, por isso vai ser seguro - contanto que o objecto subjacente executa a sua gerenciamento de conexão e leitor corretamente.

Como já foi mencionado, Close () e usando são seus amigos para as classes você usa com ObjectDataSource

.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top