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

"Custo" do EntityManager

Adicionei a classe JPAUtil e executei diversas vezes para comparar a redução do tempo de execução ao utilizar static EntityManagerFactory, mas o tempo passou a oscilar sempre em torno do resultado obtido sem usar a classe JPAUtil. Qual a vantagem do uso já que por vezes o tempo obtido é maior do que quando a classe não era utilizada?

3 respostas

Luiz, posta o seu código da JPAUtil e da sua classe de teste.

Basicamente, sem a JPAUtil, você precisa criar um EntityManager toda vez que for fazer uma operação, e isso é custoso. Utilizando a JPAUtil, ela vai criar uma única instancia do EntityManager, e devolver essa instancia para ser utilizada sempre que for solicitada em uma nova operação. Economizando o tempo de criar novas EntityManagers.

Opa, valeu, Luis, seguem as classes:

public class JPAUtil {

    private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("financas");

    public EntityManager getEntityManager() {
        return entityManagerFactory.createEntityManager();
    }
}
public class TesteJPA {

    public static void main(String[] args) {

        double inicio = System.currentTimeMillis();

        Conta conta = new Conta();
        conta.setTitular("Joao Ferreira");
        conta.setBanco("HSBC");
        conta.setNumero("123345");
        conta.setAgencia("321");
        conta.setSaldo(new BigDecimal(653.82));

        EntityManager manager = new JPAUtil().getEntityManager();

        manager.getTransaction().begin();
        manager.persist(conta);
        manager.getTransaction().commit();

        manager.close();

        double fim = System.currentTimeMillis();
        System.out.println("Executado em: " + (fim - inicio) / 1000 + "s");

    }
}
solução!

Luiz,

Veja se te ajuda a interpretar o seu teste:

A classe JPAUtil, da forma que você criou, simplesmente abstrai a responsabilidade de criar uma única vez o EntityManagerFactory. Dessa forma, se a sua aplicação, ou seu teste, utiliza diversas vezes esse EntityManagerFactory para fazer operações no banco de dados, a classe JPAUtil vai fornecer um único EntityManagerFactory para todas essas operações. Assim você não desperdiça recursos criando o EntityManagerFactory diversas vezes.

Repare que para isso você não poderá criar vários JPAUtil ( new JPAUtil().getEntityManager() ), Pois dessa forma você estará criando vários factorys do mesmo jeito.

Como seu teste possui apenas uma chamada da JPAUtil para realizar uma única operação, você não verá as vantagens dessa abordagem.

Por exemplo:

public class TesteJPA {

    public static void main(String[] args) {

        double inicio = System.currentTimeMillis();

    JPAUtil jpaUtil = new JPAUtil();

        Conta conta = new Conta();
        conta.setTitular("Joao Ferreira");
        conta.setBanco("HSBC");
        conta.setNumero("123345");
        conta.setAgencia("321");
        conta.setSaldo(new BigDecimal(653.82));

        EntityManager manager = jpaUtil.getEntityManager();

        manager.getTransaction().begin();
        manager.persist(conta);
        manager.getTransaction().commit();

        manager.close();




        //AGORA EU QUERO FAZER OUTRA OPERACAO

        manager = jpaUtil.getEntityManager();

        manager.getTransaction().begin();
        Conta mgConta = manager.find(conta);
        mgConta.setSaldo(new BigDecimal(753.82));
        manager.merge(mgConta)
        manager.close();

        double fim = System.currentTimeMillis();
        System.out.println("Executado em: " + (fim - inicio) / 1000 + "s");

    }
}