Hibernate esta deixando varias conexões abertas

11 respostas
C

Pessoal estou usando o Hibernate para fazer as persistências no banco de dados…
Acontece que eu estou criando a fabrica no método construtor dos meus JpaControllers…

public testeJpaController() { this.emf = Persistence.createEntityManagerFactory("ttttt"); }

Acontece que toda vez que eu chamo o meu controle ele esta abrindo uma conexão e ñ esta fechando, acho que é justamente da minha fabrica!!!
Vocês podem me mostrar como eu posso criar uma única fabrica pra todos os meus JpaControllers, ou fechar ela depois de usar?

meu código jpa agora ta assim:

import hibernate.dao.exceptions.NaoExisteException;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.transaction.UserTransaction;
import modelo.Usuario;

public class UsuarioJpaController implements Serializable {

    public UsuarioJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    public UsuarioJpaController() {
        //this.emf = Persistence.createEntityManagerFactory("teste");
        this.emf = FactoryJPA.getInstance().criarEntityManagerFactory();
    }
    
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void criar(Usuario usuario) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(usuario);
            em.getTransaction().commit();
        } finally {
            
            if (em != null) {
                em.close();
            }
        }
    }

    public void editar(Usuario usuario) throws NaoExisteException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            usuario = em.merge(usuario);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = usuario.getId();
                if (mostraUsuario(id) == null) {
                    throw new NaoExisteException("o usuario com id " + id + " não existe.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void deletar(Long id) throws NaoExisteException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Usuario teste;
            try {
                teste = em.getReference(Usuario.class, id);
                teste.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NaoExisteException("o usuario com id " + id + " não existe.", enfe);
            }
            em.remove(teste);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();                
            }
        }
    }

    public List<Usuario> listarUsuario() {
        return listarUsuario(true, -1, -1);
    }

    public List<Usuario> listarUsuario(int maxResults, int firstResult) {
        return listarUsuario(false, maxResults, firstResult);
    }

    private List<Usuario> listarUsuario(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Usuario as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();            
        }
    }

    public Usuario mostraUsuario(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Usuario.class, id);
        } finally {
            em.close();
        }
    }

    public int getUsuarioCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Usuario as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}

minha fabrica:

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class FactoryJPA {
    
private static FactoryJPA singleton;	

        private EntityManagerFactory emf = null;
	
	static {
		singleton = new FactoryJPA();
	}
	
	private FactoryJPA() {
		emf = Persistence.createEntityManagerFactory("TesteJpaFactorySingletonPU");
	}	
	
	public EntityManagerFactory criarEntityManagerFactory() {
		return emf;
	}
	
	
	
	public static FactoryJPA getInstance(){
		return singleton;
	}
}

esta correto???
ele esta inserindo os dados no banco…
e agora depois destas alterações, só esta criando uma conexão…

o apache ta gerando os seguintes logs:

Grave: Servlet.service() for servlet jsp threw exception
org.postgresql.util.PSQLException: ERRO: valor nulo na coluna "id" viola a restrição não-nula
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
	at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:33)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:131)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:87)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:38)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:618)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:592)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:596)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220)
	at hibernate.dao.UsuarioJpaController.criar(UsuarioJpaController.java:44)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:73)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:722)
Grave: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Unknown entity: modelo.Carro
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:223)
	at hibernate.dao.CarroJpaController.criar(CarroJpaController.java:45)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:94)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:722)

11 Respostas

J
Grave: Servlet.service() for servlet jsp threw exception  
org.postgresql.util.PSQLException: ERRO: valor nulo na coluna "id" viola a restrição não-nula

esse erro é pq vc está passando um valor nulo para esse campo, ele é PK? Tem o seu valor gerado através de um sequencial burro ou usuário informa?

C

ñ sei pq esta com esse erro ele esta inserindo corretamente…

meu modelo:

import java.io.Serializable;
import javax.persistence.*;

@Entity
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(nullable=false, length=45)
    private String nome;
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    
    
}

estou inserindo assim:

UsuarioJpaController usuarioJpa = new UsuarioJpaController();
    Usuario usuario = new Usuario();
    usuario.setNome("nome teste usuario");
    usuarioJpa.criar(usuario);

esta correto???

J

vc sabe se a lib do postgresql da suporte, a esse tipo strategy para geração do valor da id?

C

o postgres suporta…
o meu problema agora é que esta conexão fica sempre aberta…

J

hm, eu li esse artigo o cara usa o strategy do tipo sequence dai funciona

C

ele desconecta depois usando sequence?

H

Na boa, de onde você tirou que pode ser erro de conexao aberta?

Até então você só mostrou erro que apresenta erro de mapeamento.

Confira seus relacionamentos

C

a minha duvida é com relação a clientes conectados ao banco…

através deste sql eu tenho como saber quantos usuários eu tenho em atividade
SELECT count(client_addr) from pg_stat_activity;

e eu estou observando que existem conexões que não foram fechadas…

H

Você está fechando a transação manual que vc está abrindo? public UsuarioJpaController(UserTransaction utx, EntityManagerFactory emf) {Você está fechando o UserTransaction?

C

ñ estou usando este método… to fechando manualmente.

estou usando o método construtor que chama a EntityManagerFactory

e as transações são feitas depois do método getEntityManager

C

Antes estava abrido varias conexões para um único usuário…
acontece que agora, quando um usuário entra, abre apenas uma conexão, pois estou utilizando singleton na criação da fabrica…
o problema é que eu ñ consigo fechar esta conexão…

se por um acaso tiver muitos usuários utilizando o serviço, vai estoura o pool de conexões, correto?

devo, ou ñ devo fechar a minha EntityManagerFactory? como eu realizo isso??? (ja tentei fecha a minha EMF mas ñ consigo)

Criado 1 de julho de 2012
Ultima resposta 1 de jul. de 2012
Respostas 11
Participantes 3