Acesso aos dados com JPA - Hibernate está muito lento

Olá pessoal. Estou desenvolvendo uma aplicação utilizando - NetBeans + swing + JPA - Hibernate + MySQL. E estou percebendo que a cada consulta ao banco, demora muito tempo para retornar o resultado (uns 4 segundos) numa consulta simples com menos de 50 linhas. Olhando o output do Netbeans eu percebi que cada vez que eu crio um “EntityManeger”, o Hibernate carrega todas as classes que eu tenho mapeada ( 8 entidades), com suas respectivas “namedQuery”. E quando eu faço muito acessos gera um Exception:

Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
        at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
        at java.awt.image.Raster.createPac
        at java.awt.image.Raster.createPackedRaster(Raster.java:458)
        at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
        at sun.awt.image.SunVolatileImage.getBackupImage(SunVolatileImage.java:225)
        at sun.awt.image.VolatileSurfaceManager.getBackupSurface(VolatileSurfaceManager.java:252)
        at sun.awt.image.VolatileSurfaceManager.initialize(VolatileSurfaceManager.java:108)
        at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:72)
        at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:82)
        at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:93)
        at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:87)
        at sun.awt.windows.WComponentPeer.createVolatileImage(WComponentPeer.java:604)
        at java.awt.Component.createVolatileImage(Component.java:3316)
        at java.awt.Component$BltBufferStrategy.createBackBuffers(Component.java:4038)
        at java.awt.Component$BltBufferStrategy.<init>(Component.java:3983)
        at java.awt.Component$BltSubRegionBufferStrategy.<init>(Component.java:4236)
        at java.awt.Component.createBufferStrategy(Component.java:3567)
        at java.awt.Window.createBufferStrategy(Window.java:3012)
        at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(BufferStrategyPaintManager.java:844)
        at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(BufferStrategyPaintManager.java:795)
        at javax.swing.BufferStrategyPaintManager$BufferInfo.getBufferStrategy(BufferStrategyPaintManager.java:728)
        at javax.swing.BufferStrategyPaintManager.prepare(BufferStrategyPaintManager.java:505)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:263)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
        at javax.swing.JComponent.paint(JComponent.java:1013)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1780)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)

Alguém sabe o porque desta excessão? E se tem uma melhor forma de criar o EntityManeger sem carregar tudo de novo?

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="SysTexPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>tecelembu.entidade.ComposicaoTecido</class>
    <class>tecelembu.entidade.NotaFiscalTecido</class>
    <class>tecelembu.entidade.ItemNotaFiscalFio</class>
    <class>tecelembu.entidade.ItemNotaFiscalTecido</class>
    <class>tecelembu.entidade.Tecido</class>
    <class>tecelembu.entidade.Cliente</class>
    <class>tecelembu.entidade.Fio</class>
    <class>tecelembu.entidade.NotaFiscalFio</class>
    <properties>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/tecelagemembudb"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
            
    </properties>
  </persistence-unit>
</persistence>

Uma das classes DAO:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tecelembu.Dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.hibernate.Session;
import tecelembu.entidade.NotaFiscalFio;
/**
 *
 * @author camargo
 */
public class NotaFiscalFioDAO extends ImpleDAO implements InterfaceTecelagemDAO{
        
     EntityManagerFactory emf;
    
    private EntityManager getEntityManager(){
        return emf.createEntityManager();
    }
    
    public NotaFiscalFioDAO(){
        emf = Persistence.createEntityManagerFactory("SysTexPU");
    }
    
    public void atualizar(Object entidade) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.merge(entidade);
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().rollback();
            
        }finally{
            em.close();
        }
    }
    public void atualizar2(Object entidade) {
        EntityManager em = getEntityManager();
        NotaFiscalFio nf1 = (NotaFiscalFio) entidade;
        try {
            em.getTransaction().begin();
            NotaFiscalFio nf2 = em.find( NotaFiscalFio.class, nf1.getNro());
            nf2.setUtilizado(true);
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            ex.printStackTrace();
            em.getTransaction().commit();
            
        }finally{
            em.close();
        }
    }
     public void atualizar3(Object entidade) {
        EntityManager em = getEntityManager();
        NotaFiscalFio nf1 = (NotaFiscalFio) entidade;
        try {
            em.getTransaction().begin();

            NotaFiscalFio nf2 = em.find( NotaFiscalFio.class , nf1.getNro());
            nf2.setUtilizado(false);
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            ex.printStackTrace();
            em.close();
        }
    }

    public void excluir(Object entidade) {
        EntityManager em = emf.createEntityManager();
        try {
            
            em.getTransaction().begin();
            em.remove( (NotaFiscalFio) entidade);
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            em.getTransaction().rollback();
            ex.printStackTrace();
        }finally{
            
        }
    }

    public void inserir(Object entidade){
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(entidade);
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            em.getTransaction().rollback();
            ex.printStackTrace();
        }finally{
            
        }

    }

    public List buscarTodos() {
        EntityManager em = getEntityManager();
        List list = em.createQuery("from NotaFiscalFio").getResultList();
	return list;     
    }

    public Object buscar(String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Object buscar(Integer num) {
       EntityManager em = IniciaFabrica.getFactory().createEntityManager();
       try {
            em.getTransaction().begin();
            Query q = em.createQuery("from NotaFiscalFio nff  where nff.nro= :num" );
            Object ob = q.setParameter("num", num).getSingleResult();
            em.getTransaction().commit();
            return ob;
        } finally{
            em.close();
        }
    }
    
    private NotaFiscalFio getNotaFiscalFio(NotaFiscalFio nf, Session s){
         return (NotaFiscalFio) s.load(
                    NotaFiscalFio.class,nf.getNro());
        
    }
}

Fico muito grato se alguém poder me ajudar :smiley:

Se você usar jdbc template + spring framework fica mais rápido. BEM mais rápido.

Valeu pela dica kikoblues, mas eu gostaria de continuar com JPA… Será que niguém sabe resolver o Problema da memória: OutOfMemoryError? Andei pesquisando na net, e uma das soluções que vi, é de alterar o tamanho da memória do JVM. Não achei uma solução aplausive. Acho que deve ser problema do JPA/Hibernate mesmo, pois fiz mais alguns teste e descobri que qualquer tipo de consulta por mais simples que ela seja, depois de certa quantidade de consulta o erro de vazamento de memória ocorre.
Até agora não encontrei nenhuma solução :frowning:

[quote=tonkleber]Valeu pela dica kikoblues, mas eu gostaria de continuar com JPA… Será que niguém sabe resolver o Problema da memória: OutOfMemoryError? Andei pesquisando na net, e uma das soluções que vi, é de alterar o tamanho da memória do JVM. Não achei uma solução aplausive. Acho que deve ser problema do JPA/Hibernate mesmo, pois fiz mais alguns teste e descobri que qualquer tipo de consulta por mais simples que ela seja, depois de certa quantidade de consulta o erro de vazamento de memória ocorre.
Até agora não encontrei nenhuma solução :([/quote]

Pois é cara. Eu tive um problema parecido e optei por aumentar a memória da jvm. Na época, funcionou sem problemas.
Posteriormente precisei formatar minha máquina e, por incrível que pareça, o problema não apareceu mais. Nem precisei me preocupar em aumento de memória. hehehe

Quanto à sua dúvida, não posso ajudar. Por mais que já tenha trabalhado com JPA + Hibernate, sou iniciante no assunto.

Desculpe.

Meus camaradas!!! Troquei a implementação JPA do Hibernate pela do TopLink e meu acesso aos dados virou um avião a jato! E o problema com a memória não apareceu mais. Posso estar errado, mas acho que a implementção do Hibernate para JPA não tá legal,
não sei se estou fazendo algo errado… os mais entendidos que me corrijão. Só estava insistindo no Hibernate por que dizem que o TopLink para uso free tem limitação. Mas é isso aí, vou ficar com o topLink mesmo :smiley:

[quote=tonkleber]Meus camaradas!!! Troquei a implementação JPA do Hibernate pela do TopLink e meu acesso aos dados virou um avião a jato! E o problema com a memória não apareceu mais. Posso estar errado, mas acho que a implementção do Hibernate para JPA não tá legal,
não sei se estou fazendo algo errado… os mais entendidos que me corrijão. Só estava insistindo no Hibernate por que dizem que o TopLink para uso free tem limitação. Mas é isso aí, vou ficar com o topLink mesmo :D[/quote]

Pois é cara. Acredito mesmo! Não conheço esse TopLink.
No meu TCC, que é feito em dupla, estávamos utilizando Hibernate. Meu colega identificou uma possível perda de performance no futuro e trocou Hibernate para JDBC Template. Até agora a performance está ótima e acredito que não vá piorar.

Dá uma olhada neste link. Achei em algum post aqui no guj.

http://www.oracle.com/technology/products/ias/toplink/jpa/tutorials/jsf-jpa-tutorial.html

[quote]Dá uma olhada neste link.
Achei em algum post aqui no guj.http://www.oracle.com/technology/products/ias/topl...utorials/jsf-jpa-tutorial.html [/quote]

Valeu pelo link :slight_smile: