Usuário com melhor resposta
Pool de conexão

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.
- Editado Diego Gonçalves - GV segunda-feira, 20 de agosto de 2012 17:22
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.
- Marcado como Resposta Diego Gonçalves - GV terça-feira, 21 de agosto de 2012 14:09
-
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.
- Marcado como Resposta Diego Gonçalves - GV 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.
-
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?
-
-
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.
-
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.
- Marcado como Resposta Diego Gonçalves - GV terça-feira, 21 de agosto de 2012 14:09
-
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.
- Marcado como Resposta Diego Gonçalves - GV terça-feira, 21 de agosto de 2012 14:09