none
Classe helper para acesso a dados com erro de pooled connections RRS feed

  • Pergunta

  • Prezados, criei uma web application e uma classe DadosHelper.cs onde tenho os seguintes métodos:

    public static SqlDataReader Obter(string sql)
            {
                var con = ObterConnection();
                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataReader reader = cmd.ExecuteReader();
                return reader;
            }
    
    public static SqlConnection ObterConnection()
            {
                var ConnectionString = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
                SqlConnection con = new SqlConnection(ConnectionString);
                con.Open();
                return con;
            }

    Em todas as páginas que preciso recuperar dados do BD, eu chamo a função DadosHelper.Obter(string sql) passando o respectivo comando sql, como no exemplo abaixo:

    sql =

    "select ID,Titulo from CategoriasImoveis order by Titulo";

           

    varreader = DadosHelper.Obter(sql);

           

    while(reader.Read())

            {

                Menu.Append(

    "       <li><a href='ImoveisPorTipo.aspx?ent=categorias&id="+ reader["ID"] + "'>"+ reader["Titulo"] + "</a></li>");

            }

            Menu.Append(

    "   </ul>");

            reader.Close();

    sql = "select ID,Titulo from CategoriasImoveis order by Titulo";
            var reader = DadosHelper.Obter(sql);
            while (reader.Read())
            {
                Menu.Append("       <li><a href='ImoveisPorTipo.aspx?ent=categorias&id=" + reader["ID"] + "'>" + reader["Titulo"] + "</a></li>");
            }
    
            Menu.Append("   </ul>");
            reader.Close();
    No entanto, esta estratégia está causando o erro de pooled connections timeout, e sei que é decorrente de eu não estar fechando as conexões, mas não estou conseguindo encontrar uma solução para fechar as conexões porque se eu fecho a conexão na classe DadosHelper, não recebo o return do DataReader. Esta estratégia tinha o objetivo de reduzir a quantidade de código repetido todas as vezes que preciso mostrar dados provenientes do banco de dados nas minhas páginas web, mas agora não estou vendo uma maneira de fechar as conexões abertas. No início acreditei que ao chamar reader.Close(), a connection também seria fechada mas não funcionou. Alguma sugestão?


    ------------------------------- Eryx Guimarães

    quarta-feira, 7 de novembro de 2012 13:53

Respostas

  • Bom, então pode ser que o seu banco de dados esteja aceitando poucas conexões mesmo.

    Com o parâmetro ali, ele vai fechar a conexão quando chamar o close do reader.

    Vai ter que olhar no banco de dados quantas conexões estão ficando abertas, e se esse número é grande o suficiente.

    quarta-feira, 7 de novembro de 2012 18:36

Todas as Respostas

  • Na hora de chamar o ExecuteReader(), tem um parâmetro que você pode passar que vai dizer para o componente fechar a conexão automaticamente na hora que você fechar o DataReader.
    quarta-feira, 7 de novembro de 2012 14:20
  • Obrigado pela sua resposta Danimar, incluí o referido parametro, no entanto o erro de pooled connection continua acontecendo. Alguma outra sugestão?

    SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);


    ------------------------------- Eryx Guimarães

    quarta-feira, 7 de novembro de 2012 14:41
  • Bom, então pode ser que o seu banco de dados esteja aceitando poucas conexões mesmo.

    Com o parâmetro ali, ele vai fechar a conexão quando chamar o close do reader.

    Vai ter que olhar no banco de dados quantas conexões estão ficando abertas, e se esse número é grande o suficiente.

    quarta-feira, 7 de novembro de 2012 18:36
  • veja

    http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/f081fc14-be5e-407f-b0b5-17461c6515ad


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    quinta-feira, 8 de novembro de 2012 16:16
    Moderador