conexão aberta

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?

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

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

é isso?

Isso mesmo amigo.

wiliamps

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

[quote=javaCBA]pelo que eu entendi, faltou só o finally com o em.close();

é isso?[/quote]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().

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

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.

vou fazer isso, vlw

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

alguma luz ?

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

[code]

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 getPojoByID(Class 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 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 List getListByQNamed(String qryNamed, Object objFiltro) {
// String strParam = qryNamed.substring(qryNamed.indexOf(“By”) + 2).toLowerCase();
//
// Query query = ses.getNamedQuery(qryNamed).setParameter(strParam, objFiltro);
// List itens = query.list();
// sessionClosed();
// return itens;
// }

// @SuppressWarnings(“unchecked”)
// protected List getListByQNamedPRX(String qryNamed, Object objFiltro) {
// String strParam = qryNamed.substring(qryNamed.indexOf(“By”) + 2).toLowerCase();
// Query query = ses.getNamedQuery(qryNamed).setParameter(strParam, “%” + objFiltro + “%”);
// List 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; 
}

}[/code]

no demais DAOs está assim

[code]
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); }

}[/code]

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

lembrando que as linhas como essa

setAlmoxarifados(getListAlmoxarifados());

chamam o metodo


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

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

[quote=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[/quote]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).

[quote=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.[/quote]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).

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