Hibernate lento

Galera, boa noite…

Eu estava acostumado a usar o toplink no Glassfish, porém recentemente precisando fazer um sistema menor, e estou usando tomcat + hibernate.

Quando usava o toplink + glassfish, o gerênciador de persistência fazia o load das named queries e demais configurações uma vez apenas, já no tomcat + hibernate, aparentemente isso está acontecendo a todo momento que envio uma instrução e com isso a performance está péssima…

Olha o exemplo, no código abaixo, cliquei duas vezes em um botão que envia um insert pro banco.

Cadastrando...
11/08/2010 21:20:46 org.hibernate.cfg.AnnotationBinder bindClass
INFO: Binding entity from annotated class: com.innova.entity.Executives
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findAll => SELECT e FROM Executives e
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByIdexecutives => SELECT e FROM Executives e WHERE e.idexecutives = :idexecutives
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByName => SELECT e FROM Executives e WHERE e.name = :name
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByTitle => SELECT e FROM Executives e WHERE e.title = :title
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByDegree => SELECT e FROM Executives e WHERE e.degree = :degree
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByInterest => SELECT e FROM Executives e WHERE e.interest = :interest
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByLastdegree => SELECT e FROM Executives e WHERE e.lastdegree = :lastdegree
11/08/2010 21:20:46 org.hibernate.cfg.annotations.QueryBinder bindQuery

MEIO <suprimi aqui>

INFO: Named query checking : enabled
11/08/2010 21:20:51 org.hibernate.impl.SessionFactoryImpl <init>
INFO: building session factory
11/08/2010 21:20:51 org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured


Cadastrando...
11/08/2010 21:20:58 org.hibernate.cfg.AnnotationBinder bindClass
INFO: Binding entity from annotated class: com.innova.entity.Executives
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findAll => SELECT e FROM Executives e
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByIdexecutives => SELECT e FROM Executives e WHERE e.idexecutives = :idexecutives
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByName => SELECT e FROM Executives e WHERE e.name = :name
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByTitle => SELECT e FROM Executives e WHERE e.title = :title
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByDegree => SELECT e FROM Executives e WHERE e.degree = :degree
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByInterest => SELECT e FROM Executives e WHERE e.interest = :interest
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery
INFO: Binding Named query: Executives.findByLastdegree => SELECT e FROM Executives e WHERE e.lastdegree = :lastdegree
11/08/2010 21:20:58 org.hibernate.cfg.annotations.QueryBinder bindQuery

MEIO <suprimi aqui>

INFO: Named query checking : enabled
11/08/2010 21:21:00 org.hibernate.impl.SessionFactoryImpl <init>
INFO: building session factory
11/08/2010 21:21:00 org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured

Persistence.xml

[code]

<?xml version="1.0" encoding="UTF-8"?> org.hibernate.ejb.HibernatePersistence com.innova.entity.Executives com.innova.entity.Gr com.innova.entity.Groups com.innova.entity.Institute com.innova.entity.Iproject com.innova.entity.Project com.innova.entity.Researcharea com.innova.entity.Researcher com.innova.entity.User true [/code]

Valeuuuu

Um abraço.

Estranho o seu log.

Por acaso vc não está criando o SessionFactory na hora de cadastrar, está?

Isso deixaria bem lento.

Bom dia Zoren!

É, pelo código acho que sim.

Qual seria a forma de criar uma vez só?

Um abs

public class ResearchareaJpaController {

    public ResearchareaJpaController() {
        emf = Persistence.createEntityManagerFactory("innovaPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void save(Researcharea researcharea) throws PreexistingEntityException, Exception{

        EntityManager em = null;

        try {
            em = getEntityManager();

            em.getTransaction().begin();

                em.persist(researcharea);


            em.getTransaction().commit();

            em.close();
        } catch (Exception e) {
            System.out.println("Não Gravou "+e.getStackTrace()+"  "+e.getMessage()+"  "+e.getLocalizedMessage());

        }

    }
}

Vamos lá.

Criei uma classe que gerência isso, peguei um exemplo aqui do forum, ma smesmo assim ainda está lento e carregando a todo momento as queries e as confs, apesar do “Loading…” aparecer uma vez só, ou seja, ele está pegando a thread já aberta, porém ainda continua lento… :shock:

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

package com.innova.DAO;

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

/**
 *
 * @author 
 */


public final class PersistenceUtil {

     private static final String UNIT_NAME = "innovaPU";

     private static EntityManagerFactory FACTORY;

     public static final ThreadLocal<EntityManager> SESSION = new ThreadLocal<EntityManager>();

     public static EntityManager currentEntityManager() {
         EntityManager manager = (EntityManager) SESSION.get();
         if (manager == null) {
             System.out.println("#################### Loading entityManager ######################");
             loadInstance();
             manager = FACTORY.createEntityManager();
             SESSION.set(manager);
         }
         return manager;
     }

     public static void closeEntityManager() {
         EntityManager manager = (EntityManager) SESSION.get();
          if (manager != null) {
              manager.close();
         }
         SESSION.set(null);
     }

     private static synchronized void loadInstance() {
         if (FACTORY == null) {
             FACTORY = Persistence.createEntityManagerFactory(UNIT_NAME);
         }
     }


 }

Eu uso essa


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

package util;


import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory object.
 *
 * @author Felipe
 */
public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

ai vc faz no seu código:

Lento ele fica, mas apenas na primeira vez, que é quando está criando o sessionFactory, depois ele usa um que já exista

as sessões são leves então pode chamar diversas vezes que continua rapido

Enfim, na primeira vez que o sessionFactory estiver iniciando vai ficar devagar mesmo, mas nas outras vezes tem que ser rapido pq ele já está criado.

Grande Zoren

Acho que era mais influência da console do netbeans, pois fiz o Deploy no direto no tomcat e ficou rapido… :lol:

Valeu pela ajuda!

Um abraço.

Rodrigo