conexão aberta

16 respostas
J

oi pessoal,

eu tenho um sistema web rodando que usa jsf e jpa 2.
Eu percebo que mesmo não tendo mais ficado conectado na aplicação, continua conexão aberta no banco (uso o postgres).

fazendo assim, a conexão não é fechada?

try
{
    getEntityManager().getTransaction().begin();
    getEntityManager().persist(t);
    getEntityManager().getTransaction().commit();
}
catch(Exception e)
{
   if(getEntityManager().getTransaction().isActive())
   {
        getEntityManager().getTransaction().rollback();
    }
}

o problema é que quando vou no banco (como administrador), tem várias conexões abertas. Inclusive verifico conexões aberta de outros dias ( que já deixaram de ser usadas a semanas ).

Alguem tem alguma ideia de como resolver isso?

16 Respostas

W

Parece que você utiliza o Non-managed environment idiom, pois se for isso, tem que fazer do seguinte modo:

// Non-managed environment idiom
EntityManager em = emf.createEntityManager();
EntityTransaction tx = null;
try {
    tx = em.getTransaction();
    tx.begin();

    // do some work
    ...

    tx.commit();
}
catch (RuntimeException e) {
    if ( tx != null && tx.isActive() ) tx.rollback();
    throw e; // or display error message
}
finally {
    em.close();
}

Fonte: http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html

wiliamps

J

pelo que eu entendi, faltou só o finally com o em.close();

é isso?

W

Isso mesmo amigo.

wiliamps

J

falow Wiliam, vou adicionar isso aqui e ver o resultado. Dai eu posto o resultado :smiley:

H

javaCBA:
pelo que eu entendi, faltou só o finally com o em.close();

é isso?

Exato.

É preciso ter em mente que commit() não fecha transação, apenas indica pro banco de dados que os dados podem ser salvos.
Realmente é necessário chamar o close().

J

galera desculpem estar postando em um tópico que foi aberto a meses atrás, mas não queria abrir outro… estou com um problemão, faço da mesma maneira do amigo acima, mas as conexoes não são fechadas, to usando c3p0 para gerenciar o pool, limitei para 20, e como as conexoes não são fechadas e são abertas varias o sistema para logo de responder, basta acessar alguns cadastros e pronto, para de responder.

uso o em.close() no finally mas não esta fechando.

me ajudem

J

Então brother, entrei a pouco nesse projeto e percebi que quando eu abro a listagem de produtos ele faz select para buscar os dados das tabelas ( Almoxarifado, UnidadesDeMedida, TabelaDePrecos, CSOSN, CST IPI e demais dados usados nos produtos laem da tabela PRODUTO )
vejo no console os SQL sendo executado ok, no pgadmin na aba statistics que tem as conexões ativas ele cria uma conexão para cada select que é executado ( no total de 13 ) e se eu der F5 na pagina , ele não fecha as conexões anteriores e tenta abrir mais 13 e como ta limitado para 20 ele trava.
Agora eu não porque ele ta abrir 13 conexões, nunca vi isso antes.

J

vou fazer isso, vlw

J

pior que ele ta executando o em.close(); sem gerar excessão alguma… é isso que ta me deixando maluco kk

J

alguma luz ?

J

vamos la então
quando eu peguei o genericDAO ta assim , uma verdadeira zona:

package org.smartgestor.dao;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.smartgestor.util.EntityManagerUtil;

/**
 *
 * @author Gilton Nascimento
 * @version 1.2
 */

public class GenericDao {

    protected Session ses;
    private boolean sessionClosed = false;
    protected EntityManager em;
    private EntityManagerUtil emu;
    
    public GenericDao() {
       
    	
    }

    protected Session getSession() {
    	return emu.getSession();
    }
    
    protected EntityManager getEntity() {
    	return EntityManagerUtil.getEntityManager();
    }
    
    /* Save and Update */
    protected void savePojo(Object obj) {
    	em = getEntity();
        try {
        	em.getTransaction().begin();
        	em.persist(obj);
        	em.getTransaction().commit();		
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		}
        finally
        {
        	em.close();
        }
        
        //safeCommitONClose();
    }
    
    /* Update */
    protected void updatePojo(Object obj) {
    	em = getEntity();
    	try {
			em.getTransaction().begin();
			em.flush();
			em.merge(obj);
			em.getTransaction().commit();
			
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		}
    	finally
    	{
    		em.close();
    	}
    	
    	
    	/*ses.flush();
    	ses.update(obj);
    	safeCommitONClose();*/
    }
    
    /* Update */
    protected <T extends Serializable> void updateEntityPojo(T obj) {
    	getEntity().flush();
    	getEntity().merge(obj);
    	safeCommitONClose();
    }

    /**
     * @author Gilton
     * @since  19/11/2012-09:43:38
     * @param obj 
     * void
     */
    protected void removerPojo(Object obj) {
    	em = getEntity();
    	
    	try {
			em.getTransaction().begin();
			em.remove(obj);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		}
    	finally
    	{
    		em.close();
    	}
    	
    	
        /*ses.delete(obj);
        safeCommitONClose();*/
    }
    
    /**
     * @author José Aureliano de Oliveira Junior
     * @since  31/01/2013-12:29:38
     * @param obj 
     * void
     */
    
    protected void removerPojoDetached(Object obj)
    {
    	
    	em = getEntity();
    	
    	try {
			em.getTransaction().begin();
			obj = em.merge(obj);
			em.remove(obj);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		}
    	finally
    	{
    		em.close();
    	}
    	
    	/*ses.beginTransaction();
    	obj = ses.merge(obj);
    	ses.delete(obj);
    	safeCommitONClose();*/
    }
        
    /**
     * @author Gilton Nascimento
     * @since  27/12/2012-17:59:27
     * @param classe Class<T>
     * @param id long 
     * void
     */
    protected<T extends Serializable> void removerPojo(Class<T> classe, long id) {
    	
    	if( id != 0 && classe != null ) {
    		getEntity().remove( getEntity().find(classe, id) );
    		safeCommitONClose();
    	}
    }
    
    protected <T extends Serializable> void removerPojoReferenced(Class<T> cls, Object obj) {
    	getEntity().remove( getEntity().getReference(cls, obj) );
		safeCommitONClose();
    }
    
	/**
	 * @author Gilton Nascimento
	 * @since  19/11/2012-10:49:47
	 * @param <T>
	 * @param obj
	 * @param nomeSQLCampoID
	 * @param id 
	 * void
	 */
	protected <T extends Serializable> void removerPojo(Class<T> obj, String nomeSQLCampoID, long id) {
    	Object objeto = ses.createCriteria(obj).add(Restrictions.eq(nomeSQLCampoID,id)).uniqueResult();
    	ses.delete(objeto);
    	safeCommitONClose();
    }
	
	/**
	 * @author Gilton Nascimento
	 * @since  19/11/2012-10:49:57
	 * @param <T>
	 * @param obj
	 * @param sql
	 * @param id 
	 * void
	 */
	protected <T extends Serializable> void removerPojoByQry(Class<T> obj, String sql, long id) {
		if ( isSessionClosed() ) ses = getSession();
		ses.createQuery(sql).setParameter("codigo", id).executeUpdate();
		safeCommitONClose();
	}
	
	/**
	 * @author Gilton Nascimento
	 * @since  19/11/2012-10:50:47
	 * @param <T>
	 * @param obj
	 * @param sql void
	 */
	protected <T extends Object> void removerPojo(T obj, String sql) {
		ses.createQuery(sql).executeUpdate();
		safeCommitONClose();
	}
	
//    Consultas
    @SuppressWarnings("unchecked")
    protected <T extends Serializable> T getPojoByID(Class<T> classe, Serializable key) {
        Serializable obj = (Serializable) ses.get(classe, key);
        
        if( !isSessionClosed() ) sessionClosed();

        return (T) obj;
    }
    
    @SuppressWarnings("unchecked")
	protected <T extends Serializable> T getPojoByID( Class<T> classe, String fieldID, long id ) {
    	T obj = (T) ses.createCriteria(classe).add(Restrictions.eq(fieldID, id)).uniqueResult();
    	
    	if( !isSessionClosed() ) sessionClosed();
    		
    	return obj; 
    }
    
    @SuppressWarnings("unchecked")
    protected <T extends Serializable> T getPojoByQry(String query, Object... params) {
        org.hibernate.Query qry = ses.createQuery(query);

        for (int i = 0; i < params.length; i++) { 
            qry.setParameter(i, params[i]);
        }
        Object obj = qry;
        sessionClosed();
        return (T) obj;
    }
    
    @SuppressWarnings("unchecked")
	protected <T extends Serializable> T getPojoByFilterSTR(Class<T> classe, String fieldName, String filter) {
    	T obj = (T) ses.createCriteria(classe).add(Restrictions.eq(fieldName, filter)).uniqueResult();
    	sessionClosed();
    	return (T) obj;
    }
    

//    @SuppressWarnings("unchecked")
//    protected <T extends Serializable> T getPojoByQNamed(String qNamed, Object objFiltro) {
//        String strParam = qNamed.substring(qNamed.indexOf("By") + 2).toLowerCase();
//        Query query = ses.getNamedQuery(qNamed).setParameter(strParam, objFiltro);
//        Object obj = query.uniqueResult();
//
//        if( isSessionClosed() ) sessionClosed();
//
//        return (T) obj;
//    }
//
    
    
    @SuppressWarnings("unchecked")
    protected <T extends Object> List<T> getALLCriteria(Class<T> cls) { /// esse aqui é o que estou usando e que eu alterei
    	
    	EntityManager em = getEntity();
    	try {
    		
        	List<T> lista = getEntity().createQuery("select o from "+cls.getSimpleName()+" o").getResultList();
        	
        	return lista;
		} catch (Exception e) {
			System.out.println("Erro = "+e.getMessage());
			return null;
		}
    	finally
    	{
    		try
    		{
    			em.close();	
    			System.out.println("Executou o em.close()");
    		}catch(Exception ex)
    		{
    			ex.printStackTrace();
    		}
    		
    	}
    	
    	
    	/*
		List<T> itens = ses.createCriteria(cls).list();
		sessionClosed();
		
		return itens;
    	*/
	}
    
    /**
     * Fecha a sessão caso seja true e recupera todas as ocorrências daquela tabela
     * @param <T>
     * @param classe Class<T>
     * @param sessionClosed boolean
     * @return List<T>
     */
    @SuppressWarnings("unchecked")
    protected <T extends Object> List<T> getALL(Class<T> classe) {
    	Criteria query = ses.createCriteria("SELECT c FROM " + classe.getSimpleName() + " c");
        List<T> itens = query.list();

        if( !isSessionClosed() ) sessionClosed();

        return itens;
    }
    
    /**
     * 
     * Usada caso o nome das entidade nao estejam compativeis com as do banco de dados.
     * @author Gilton Nascimento
     * @since  30/11/2012-15:41:07
     * @param <T>
     * @param classe
     * @param toLowerPalavra
     * @return List<T>
     */
    @SuppressWarnings("unchecked")
    protected <T extends Object> List<T> getALL(Class<T> classe, String toLowerPalavra) {
    	
    	String realNameEntity = "";
    	
    	if( toLowerPalavra.equals("1") ) 
    		realNameEntity = classe.getSimpleName().substring(0,1).toLowerCase().concat( classe.getSimpleName().substring(1) );
    	
    	Criteria query = ses.createCriteria("SELECT * FROM " + realNameEntity + " ");
    	List<T> itens = query.list();
    	
    	if( !isSessionClosed() ) sessionClosed();
    	
    	return itens;
    }
    
    
    /**
     * @author Gilton Nascimento
     * @since  30/11/2012-12:52:42
     * @param <T>
     * @param cls
     * @param filter
     * @return List<T>
     */
    @SuppressWarnings("unchecked")
	protected <T extends Object> List<T> getALLByFilter( Class<T> cls, String filter ) {
    	return (List<T>) ses.createCriteria(cls).add(Restrictions.eq("situacao", filter)).list();
    }
    
    @SuppressWarnings("unchecked")
    protected <T extends Object> List<T> getALLByFilter( Class<T> cls, String filter, Date dt ) {
    	return (List<T>) ses.createCriteria(cls).add(Restrictions.eq("situacao", filter)).
    	add(Restrictions.eq("dataVencimento", dt)).list();
    }
    
//
// Ate o momento, eh considerado desnecessario.
//    @SuppressWarnings("unchecked")
//    protected <T extends Serializable> List<T> getListByQNamed(String qryNamed, Object objFiltro) {
//        String strParam = qryNamed.substring(qryNamed.indexOf("By") + 2).toLowerCase();
//
//        Query query = ses.getNamedQuery(qryNamed).setParameter(strParam, objFiltro);
//        List<T> itens = query.list();
//        sessionClosed();
//        return itens;
//    }

//    @SuppressWarnings("unchecked")
//    protected <T extends Serializable> List<T> getListByQNamedPRX(String qryNamed, Object objFiltro) {
//        String strParam = qryNamed.substring(qryNamed.indexOf("By") + 2).toLowerCase();
//        Query query = ses.getNamedQuery(qryNamed).setParameter(strParam, "%" + objFiltro + "%");
//        List<T> itens = query.list();
//        sessionClosed();
//        return itens;
//    }

    @SuppressWarnings("unchecked")
	protected <T extends Serializable> List<T> getListByFilter(Class<T> cls, String toLower, String filter, Object...params) {
    	Query qry = ses.createFilter(getALL(cls), filter);
    	
    	for(int i = 0; i <params.length; i++)
    		qry.setParameter(i, params[i]);
    	
    	List<T> itens = qry.list();
    	
    	return itens;
    }
    
    
    @SuppressWarnings("unchecked")
    protected <T extends Serializable> List<T> getListByQry(String query, Object... params) {
        Query qry = ses.createQuery(query);
        for (int i = 0; i < params.length; i++)
            qry.setParameter(i, params[i]);
        
        List<T> itens = qry.list();
        sessionClosed();
        return itens;
    }

//  Commits
    private void safeCommitONClose() {
        try {
        	
        	if( !ses.getTransaction().isActive() ) ses.getTransaction().begin();
        	
            ses.getTransaction().commit();
            
        } catch (HibernateException e) {
            System.err.println("HibernateException!!\n" + "Error no SafeCommit: " + e.getMessage());
            ses.getTransaction().rollback();
        } catch (Exception e) {
            System.err.println("Error no SafeCommit: " + e.getMessage());
            ses.getTransaction().rollback();
        } finally { sessionClosed(); }
        
    }    

//  CloseSession
    public void sessionClosed() {
        ses.flush();
        ses.clear();
        ses.close();
        
    }

    /**
     * @return the sessionClosed
     */
    public boolean isSessionClosed() { return sessionClosed; }

    /**
     * @param sessionClosed the sessionClosed to set
     */
    public void setSessionClosed(boolean sessionClosed) { this.sessionClosed = sessionClosed; }

	protected <T extends Serializable> T findPojo(Class<T>cls, Long id) {
		T t = getEntity().find(cls, id);
		sessionClosed();
		return t; 
	}

}

no demais DAOs está assim

package org.smartgestor.dao;

import java.util.List;

import org.smartgestor.negocio.Almoxarifado;

public class AlmoxarifadoDAO extends GenericDao {

	
	public void salvarAlmoxarifado(Almoxarifado almoxarif) { savePojo(almoxarif); }
	
	public void alterarAlmoxarifado(Almoxarifado almoxarif) { updatePojo(almoxarif); }
	
	public void removerAlmoxarifado(Almoxarifado almoxarif) { removerPojo(almoxarif); }
	
	public void removerAlmoxarifado(long id) { removerPojo(Almoxarifado.class, "idAlmoxarifado" ,id); }
	
	public List<Almoxarifado> getALLAlmoxarifados() { return getALLCriteria(Almoxarifado.class); }
	
	public Almoxarifado getAlmoxarifadoByID(long id){ return getPojoByID(Almoxarifado.class, "idAlmoxarifado", id); }

}

ai no managedbean, esta assim o @postConstruct

@PostConstruct
	private void init() {
		setProduto(new Produto());
		setSelected(new Produto());
		setUnidadeMedida(new UnidadeMedida());
		setUnidadeCompra(new Unidade());
		setUnidadeVenda(new Unidade());
		setAlmoxarifado(new Almoxarifado());
		setTipoItem(new TipoItem());
		setOrigem(new Origem());
		setCstICMS(new CstICMS());
		setCstIPI(new CstIPI());
		setCsosn(new Csosn());
		setPiscofins(new CstPisCofins());
	
		setFlagPV(false);
		
		setGrupo( new Grupo() );
		setSubGrupo( new SubGrupo() );
		setDesabilitarSubGrupo(true);
		
		setProdutos( getListProdutos() ); //abre uma conexão e faz um select
		setGrupos( getListGrupos() ); //abre uma conexão e faz um select
		setSubgrupos( getListSubGrupos() );//abre uma conexão e faz um select
		
		setUnidadesCompra( getListUnidades() );//abre uma conexão e faz um select
		setUnidadesVenda( getListUnidades() );//abre uma conexão e faz um select
		setUnidadesDeMedidas( new ArrayList<UnidadeMedida>() );


		setAlmoxarifados(getListAlmoxarifados());//abre uma conexão e faz um select
		setTiposItens( getListTiposItens() );//abre uma conexão e faz um select
		setOrigens( getListOrigens() );//abre uma conexão e faz um select
		setListCstICMS( getListCSTs() );//abre uma conexão e faz um select
		setListCstIPI( getListCSTIPIs() );//abre uma conexão e faz um select
		setListCsosn(getListCSOSNs());//abre uma conexão e faz um select
		setListPisCofins(getListPISCOFINs());//abre uma conexão e faz um select
		
		
		setValoresDePrecos( getListPrecosDeVendas() );//abre uma conexão e faz um select
		
		setTabelasDePreco(new ArrayList<PrecoDeVenda>());
		
		getAllPrecosTabela();
		setSelectedPV(new PrecoDeVenda());
		setPmodel(new ProdutosModel( getProdutos() ));
		setTabelasDePrecoPrd(new ArrayList<TabelaPrecosModel>());
		setGradeDoProduto(new ArrayList<GradeProduto>());
		setItemGrade(new GradeProduto());
		setComposicao(new Composicao());
	}

e ele não fecha as conexões por nada nesse universo

J

lembrando que as linhas como essa

setAlmoxarifados(getListAlmoxarifados());

chamam o metodo

public List<Almoxarifado> getALLAlmoxarifados() { return getALLCriteria(Almoxarifado.class); }
J

ainda não resolvi, só pra constar :x

W

Jr webmaster 100% java:
galera desculpem estar postando em um tópico que foi aberto a meses atrás, mas não queria abrir outro… estou com um problemão, faço da mesma maneira do amigo acima, mas as conexoes não são fechadas, to usando c3p0 para gerenciar o pool, limitei para 20, e como as conexoes não são fechadas e são abertas varias o sistema para logo de responder, basta acessar alguns cadastros e pronto, para de responder.

uso o em.close() no finally mas não esta fechando.

me ajudem

Ao usar um pool de conexões, o close não fecha a comunicação, apenas torna disponível aquele item do pool para uso. A tática do pool é disponibilizar ASAP uma conexão pronta para uso (ou seja, não deverá existir o gap de criar a conexão). O pool tende a manter apenas um conjunto mínimo de conexões (definidas por você).

O que é preciso verificar é se há conexões sendo criadas além das 20 (significando que, talvez, não esteja sendo invocado o close).

W

Jr webmaster 100% java:
Então brother, entrei a pouco nesse projeto e percebi que quando eu abro a listagem de produtos ele faz select para buscar os dados das tabelas ( Almoxarifado, UnidadesDeMedida, TabelaDePrecos, CSOSN, CST IPI e demais dados usados nos produtos laem da tabela PRODUTO )
vejo no console os SQL sendo executado ok, no pgadmin na aba statistics que tem as conexões ativas ele cria uma conexão para cada select que é executado ( no total de 13 ) e se eu der F5 na pagina , ele não fecha as conexões anteriores e tenta abrir mais 13 e como ta limitado para 20 ele trava.
Agora eu não porque ele ta abrir 13 conexões, nunca vi isso antes.
Veja se está alcançando mesmo a chamada ao método close e se o mesmo não está lançando alguma exceção (PS: Coloque a chamada ao método close dentro de um try-catch mesmo que esteja dentro de um bloco finally).

W

Posta como você está obtendo a conexão e como está fechando. Talvez tenha algo aí…

Criado 13 de fevereiro de 2013
Ultima resposta 2 de mai. de 2013
Respostas 16
Participantes 5