3
respostas

Duvida sobre o comportamento do JNDI no caso de Entity Manager estático

Bom dia a todos q estão perdendo o fds programando rs. No meu Glassfish criei um pool de conexões e JNDI. Minimo de conexões 8, ou seja, ele sempre mantem 8 conexões abertas com o BD. Criei uma classe na aplicação para fornecer um Entity manager aos outros, nessa classe o EM é estático, logo, existe apenas 1 instancia dele na aplicação. Ex:

public class ConnectionFactory {

    private EntityManagerFactory emf;
    private static EntityManager em;
public ConnectionFactory() {
        if(emf==null||!emf.isOpen()){
            System.out.println("::::: EMF NULO OU FECHADO :::::");
            emf=Persistence.createEntityManagerFactory("jpbx");
        }
        if(em==null||!em.isOpen()){
            System.out.println("::::: CRIANDO EM :::::");
            em=emf.createEntityManager();
        }
    }
public EntityManager getEm() {
        return em;
    }
}

Observação: Não fecho este EM em nenhuma das minhas classes DAO. Minha pergunta: Se o EM é estático significa q sempre usarei apenas 1 das 8 conexões disponíveis?

Att.

3 respostas

sim Jefferson, é isso mesmo! mas aqui temos dois problemas:

  1. não é bom ter uma única conexão para ser usada no sistema inteiro, ainda mais de maneira concorrente. O comum é cada request utilizar uma diferente. Há modelos ainda mais complicados.

  2. A sua EntityManagerFactory não é estática! Então se outra pessoa der new ConnectionFactory uma nova EntityManagerFactory será preparada, o que consome muito tempo

Obrigado Paulo. Vc acha q neste cenário seria mais indicado eu ignorar a classe ConnectionFactory q criei e nas classes DAO simplesmente solicitar o EM direto? Ex:

em = Persistence.createEntityManagerFactory("jpbx").createEntityManager();

Aí o problema inverte:

  1. Não é legal chamar createEntityManagerFactory toda hora. Ele gasta um trabalhao todo para se configurar, etc.
  2. Criar um entityManager dentro do DAO tambem tem de ser feito com cuidado. Talvez voce esteja exagerando e poderia reaproveitar o EM durante a requisicao

Procure por open entity manager in view. É o padrao mais clássico para resolver isso. Aqui tem um exemplo: http://stackoverflow.com/questions/24972941/open-entitymanager-in-view-in-jpa-for-java-ee

Mas há varias maneiras de se implementar. O Spring já vem com um pronto. não me lembro o nome