Olá galera mais uma vez estou com o seguinte problema:
Verificamos que o Firebird fica com a memória crescendo enquanto a conexão não é fechada corretamente, ou seja, tendo 3 conexões dierentes no banco simultaneamente, por mais que somente uma tenha executado statements, enquanto as 3 não forem fechados os processos continuam carregando no cache.
Comecei a correr o código tentando descobrir onde está o Connection Leak, porque tinha certeza que um lugar estava deixando uma conexão aberta. Acabei encontrando que o que fazia uma conexão com o banco e nunca fechava era a própria SessionFactory. Quando se fecha a SF a tal conexão perdida é automaticamente liberada. Isso é correto? Existe alguma maneira de que a SF não abra conexãoes, porque sempre cri que quem fazia a conexão era a Session e não a Session Factory
OBS.: Utilizo o C3p0 com a seguinte config:
<!-- Configura o C3p0 -->
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">100</property> <!-- seconds -->
<property name="c3p0.max_size">100</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">10</property>
<property name="c3p0.timeout">100</property> <!-- seconds -->
Agradeço mais uma vez a atenção e a ajuda!!!
Abraço galera
fala raphaelcmacedo…
não sei como seus DAOs estao estruturados, tive um problema parecido com esse, a cada consulta no banco era criado uma nova conexao e ela não fechava mesmo com o ‘session .close()’ no finnaly, tb utilizava o c3p0
o meu problema era que eu estava abrindo um Session factory toda vez q eu ia no banco, ai chegava uma hr que o limite de conexoes estourava…
o que eu fiz para resolver foi abrir uma session factory do hibernate somente uma vez na hr de realizar o login por exemplo e gravar na sessao.
meu DAO…
HttpSession req ;
Session session ;
Vendas venda;
public VendasDAO(){
req = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
session = (Session) req.getAttribute("sessao");
}
public List<Vendas> getListar(){
try {
List<Vendas> lista = new ArrayList<Vendas>();
Criteria consulta = this.session.createCriteria(Vendas.class);
lista = consulta.list();
return lista;
}
catch (Exception sqle){
throw new DAOException("Erro ao listar vendas."+sqle.getMessage(),sqle);
}
finally{
session.disconnect();
session.flush();
}
}
neste caso estou utilizando JSF
Verifiquei e utilizo a mesma SessionFactory em todo o sistema. O problema que eu tenho é que realmente não posso ter essa conexão que está ficando aberta o tempo todo. Preciso que quando o sistema esteja ocioso todas as conexões estejam fechadas. Fiz um teste aqui sem pé nem cabeça:
Logo em seguinda de dar o buildSessionFactory eu a fecho e nesse momento essa conexão é liberada. Quando vou fazer a próxima consulta, como um query.list() ou query.uniqueResult() ele consegue montar a session mesmo com a SessionFactory fechada e no momento que ele executa o statement ele cria uma outra conexão e fica no banco sem fechar, de um jeito parecido ao da SessionFactory. Não importa se eu faça session.disconect(), session.close() abrir e fechar uma transação nada fecha essa tal conexão