Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

EntityManagerFactory sessão fechada

Sobre este tópico https://cursos.alura.com.br/forum/topico-alteracao-no-banco-de-dados-61630

Resolveu, mas agora dá outro erro de EntityManagerFactory is closed

Criei esta classe:

package br.com.netsoft.dao;

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

    public class JPAUtility {

        private static final EntityManagerFactory emFactory;
        static {
            emFactory = Persistence.createEntityManagerFactory("desif");
        }

        public static EntityManager getEntityManager() {
            return emFactory.createEntityManager();
        }

        public static void close() {
            emFactory.close();
        }
    }

No DAO genérico, criei estes métodos:

    protected EntityManager getEntityManager() {
        return JPAUtility.getEntityManager();
    }

    private void jpaFechar() {
          JPAUtility.close();
       }

       private void fechar() {
           getEntityManager().clear();
           jpaFechar();
       }

Método de buscar

 public Set<?> listar(GHEntity entidadeUm, GHEntity entidadeDois,
                Integer primeiroRegistro, Integer totalRegistros,
                String... ordenacao) throws Exception {
        getEntityManager();
        List aux = new ArrayList<>();
        Session sessao = (Session) getEntityManager().getDelegate();
        Criteria crit = sessao.createCriteria(entidadeUm.getClass());
        montaRestricoes(entidadeUm, entidadeDois, crit,
                new DadosDeSuporteAPesquisa());
        contarTodos(entidadeUm, entidadeDois);
        ordenar(crit, ordenacao);
        if (primeiroRegistro >= 0 && totalRegistros > 0) {
            if (!(total.equals(new Long(0)))) {
                crit.setFirstResult(primeiroRegistro);
                crit.setMaxResults(totalRegistros);
            }
        }
        aux = crit.list();
        sessao.evict(entidadeUm);
        jpaFechar();
        return aux;
    }

Entendi que o problema é que o EntityManagerFactory, fechou. Mas ainda não descobri como ajustar

 00:04:45,845 ERROR [stderr] (default task-17) java.lang.IllegalStateException: EntityManagerFactory is closed

    00:04:45,845 ERROR [stderr] (default task-17)     at org.hibernate.jpa.internal.EntityManagerFactoryImpl.validateNotClosed(EntityManagerFactoryImpl.java:388)

    00:04:45,845 ERROR [stderr] (default task-17)     at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:342)

    00:04:45,848 ERROR [stderr] (default task-17)     at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313)

    00:04:45,850 ERROR [stderr] (default task-17)     at br.com.netsoft.dao.JPAUtility.getEntityManager(JPAUtility.java:15)

    00:04:45,850 ERROR [stderr] (default task-17)     at br.com.netsoft.dao.GHDAO.getEntityManager(GHDAO.java:71)

    00:04:45,850 ERROR [stderr] (default task-17)     at br.com.netsoft.dao.GHDAO.listar(GHDAO.java:106)

    00:04:45,850 ERROR [stderr] (default task-17)     at br.com.netsoft.configuracao.auth.JwtUserDetailsService.loadUserByUsername(JwtUserDetailsService.java:28)

    00:04:45,850 ERROR [stderr] (default task-17)     at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$UserDetailsServiceDelegator.loadUserByUsername(WebSecurityConfigurerAdapter.java:442)

    00:04:45,851 ERROR [stderr] (default task-17)     at br.com.netsoft.configuracao.auth.JwtAuthorizationTokenFilter.doFilterInternal(JwtAuthorizationTokenFilter.java:74)
4 respostas

Fala ai Guilherme, de boa ?

Cara acho que talvez você não esteja abrindo.

  static {
            emFactory = Persistence.createEntityManagerFactory("desif");
        }

To com dúvida dessa sintaxe ainda, não sei se está sendo executada.

Acredito que você podia colocar isso num método e chama-lo:

public class JPAUtility {

        private static final EntityManagerFactory emFactory;
       private static void cria() {
            emFactory = Persistence.createEntityManagerFactory("desif");
        }

        public static EntityManager getEntityManager() {
    if (emFactory == null){
        cria();
    }
            return emFactory.createEntityManager();
        }

        public static void close() {
            emFactory.close();
        }
    }

Por esta consulta: SELECT COUNT(*) from pg_stat_activity;, quando ficar superior a 120.

Não entendi porque só aumenta.

Agora dá outro erro:

https://gist.github.com/guilhermecostalopes/1aff7258ebc3db06082efa2099d1c32b

Oi Guilherme, tudo bem?

Posta aqui seu persistence.xml? Você criou o datasource no servidor de aplicação?

[]'s

solução!

Consegui resolver assim:

Ficando assim:

    public Set<?> listar(GHEntity entidadeUm, GHEntity entidadeDois,
                Integer primeiroRegistro, Integer totalRegistros,
                String... ordenacao) throws Exception {
            EntityManager em = JPAUtility.getEntityManager();
            RecordDataSet<GHEntity> linkedHashSet;
            try {
                List aux = new ArrayList<>();
                Session sessao = (Session) em.getDelegate();
                Criteria crit = sessao.createCriteria(entidadeUm.getClass());
                montaRestricoes(entidadeUm, entidadeDois, crit,
                        new DadosDeSuporteAPesquisa());
                contarTodos(entidadeUm, entidadeDois);
                ordenar(crit, ordenacao);
                if (primeiroRegistro >= 0 && totalRegistros > 0) {
                    if (!(total.equals(new Long(0)))) {
                        crit.setFirstResult(primeiroRegistro);
                        crit.setMaxResults(totalRegistros);
                    }
                }
                aux = crit.list();
                linkedHashSet = new RecordDataSet<GHEntity>(aux);
                linkedHashSet.setTotal(total);
                sessao.evict(entidadeUm);
            } finally {
                em.close();
            }
            return linkedHashSet;
        }

Classe JPAUtility

package br.com.netsoft.dao;

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

public class JPAUtility {

    private static EntityManagerFactory emFactory = null;

    private static void cria() {
        emFactory = Persistence.createEntityManagerFactory("desif");
    }

    public static EntityManager getEntityManager() {
        if (emFactory == null) {
            cria();
        }
        return emFactory.createEntityManager();
    }

    public static void close() {
        emFactory.close();
    }
}