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