none
Pool de conexão RRS feed

  • Pergunta

  • Boa tarde!

    Estou com uma dúvida aqui, talvez possam me ajudar.

    Tenho um sistema com muitos campos no formulário, muitos acessos ao banco a medida que o usuário vai operando o sistema. 

    Quando vou analisar o servidor, está com um monte de conexões ativas, sendo que só tem um usuário operando o sistema. Mesmo fechando minhas conexões(não explicitamente), a conexão permanece ativa.

    Segue minha string e a classe de conexão:

    String:

    <add name="strConexao" connectionString="server=mysql.servidor.com.br; User Id=usuario; password=abc1234; Persist Security Info=True; 
             MinimumPoolSize=0;  MaximumPoolSize=100; Pooling=true;  Protocol=TCP; Connection Lifetime=15; database=banco"/>

    Classe:

    public MySqlConnection ConexaoDB()
        {
            using (MySqlConnection conection = new MySqlConnection(WebConfigurationManager.ConnectionStrings["strConexao"].ConnectionString))
            {
                conection.Open();
                return conection;
            }
        }

     Estou fazendo algo de errado, pois utilizando o "using" é executado o dispose automaticamente, não?

    Caso possam me ajudar, agradeço.



    segunda-feira, 20 de agosto de 2012 17:21

Respostas

  • mas é claro amigo,

    você tem que fechar o objeto SqlConnection. Você abre ele no método "Getprodutos" e não fecha depois. Desse jeito sua conexão va ficar aberta indefinitivamente. Você tem que fecha-la em algum passo, seja no fim do método ou em algum outro lugar, mas tem de fechar se não é impossivel de resolver seu problema.

    Sugestão: Depois de executar o cmd.executereader(); dê um con.close() para fechar a conexão.

    terça-feira, 21 de agosto de 2012 11:54
  • Obrigado, Marcos.

    A dica que me deu não funciona em caso de datareader. Mas consegui resolver de outra forma, não sei se a ideal, porém, resolveu. Criei uma variável do tipo MySqlConnection, e utilizo ela nos métodos onde retornam datareader, criei outro método que fecha essa variável. Dessa forma resolveu, como disse, não sei se da maneira mais apropriada. 

    Obrigado novamente.

    terça-feira, 21 de agosto de 2012 14:09

Todas as Respostas

  • rapaz, o "using" dá um dispose no objeto automaticamente sim. Porém, vejo que você está retornando o objeto para ser reutilizado em outro lugar. Dessa forma, creio que o using não "fechará o objeto", pois ainda está sendo usado. 

    Como solução dê um "close" no sqlconnection no último método que utiliza o objeto.

    segunda-feira, 20 de agosto de 2012 17:30
  • Obrigado pela resposta. Acredito que encontrei a possível causa.

    Nas classes em que retorno um dataset, onde existe a possibilidade de fechar a conexão sem perder os registros, não estou tendo problemas, porém, nas classes onde retorno um MYSQLDATAREADER, estou tendo problemas.

    Mas como eu fecho a conexão, se fechar a conexão perco os registros do datareader?

    segunda-feira, 20 de agosto de 2012 17:50
  • Depois de vinculado os dados, pode fechar sim. Não esqueça de fechar seu reader tambem.

    Pra fechar a conexão:

    con.close(); ou con.dispose();

    segunda-feira, 20 de agosto de 2012 18:11
  • Obrigado pela resposta. 

    Tentei aqui, mas não obtive êxito. Estou tentando assim:

    Essa classe "consome" a classe conexão e retorna um datareader:

    public MySqlDataReader GetProdutos(int CodProduto)
        {
            Conexao conexao = new Conexao();
            MySqlConnection conn = conexao.ConexaoDB();
           
            MySqlCommand cmd = new MySqlCommand("Select * From produtos Where CodProduto = @CodProduto", conn);
            cmd.Parameters.Add("@CodProduto",CodProduto);
                conn.Open();
                MySqlDataReader dtr = cmd.ExecuteReader();
                return dtr;        
        }

    Na página que exibe o resultado faço assim:

    ManterRegistro Get = new ManterRegistro(); MySqlDataReader dtr = Get.GetProdutos(Convert.ToInt32(CodProduto)); if(dtr.Read()) { ....... ....... dtr.Close();

    }


    Porém, ainda assim ele não fecha a conexão. 

    segunda-feira, 20 de agosto de 2012 21:12
  • mas é claro amigo,

    você tem que fechar o objeto SqlConnection. Você abre ele no método "Getprodutos" e não fecha depois. Desse jeito sua conexão va ficar aberta indefinitivamente. Você tem que fecha-la em algum passo, seja no fim do método ou em algum outro lugar, mas tem de fechar se não é impossivel de resolver seu problema.

    Sugestão: Depois de executar o cmd.executereader(); dê um con.close() para fechar a conexão.

    terça-feira, 21 de agosto de 2012 11:54
  • Obrigado, Marcos.

    A dica que me deu não funciona em caso de datareader. Mas consegui resolver de outra forma, não sei se a ideal, porém, resolveu. Criei uma variável do tipo MySqlConnection, e utilizo ela nos métodos onde retornam datareader, criei outro método que fecha essa variável. Dessa forma resolveu, como disse, não sei se da maneira mais apropriada. 

    Obrigado novamente.

    terça-feira, 21 de agosto de 2012 14:09