Hibernate muito lento na hora de salvar um unico registro - Ajuda para otimizar código

2 respostas
marcellandrade

Olá Pessoal. Estou fazendo um trabalho de faculdade onde estou avaliando o desempenho do Hibernate. Eu estou achando ele muito lento para salvar um simples registro. Está demorando quase 2 segundos sendo que era pra ser meio segundo. Será que pode ser o log que está ativado? Estou usando o slf4j para debugar. Como eu desativo ele?

Banco utilizado: Mysql5 InnoDB

public class PageDAO {

	private static final Log log = LogFactory.getLog(PageDAO.class);

	private final SessionFactory sessionFactory = getSessionFactory();

	protected SessionFactory getSessionFactory() {
		try {
			return new Configuration().configure()
			.buildSessionFactory();
			
		} catch (Exception e) {
			log.error("erro buildSessionFactory", e);
			throw new IllegalStateException(
					"erro buildSessionFactory");
		}
	}

	public void persist(Page transientInstance) {
		log.debug("persisting Page instance");
		Session session = sessionFactory.openSession();
		Transaction transaction = null;
		Long courseId = null;
		try {
			transaction = session.beginTransaction();
			session.persist(transientInstance);
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			sessionFactory.close();
		}
	}
public class PageTest{

	
  public static void main(String args[]) {
		 
	   long tempoInicial = System.currentTimeMillis();  
		PageDAO pageDao = new PageDAO();
		Page page = new Page();
		page.setPageNamespace(234234);
		page.setPageTitle("ooooo");
		byte[] s = new byte[3];
		page.setPageRestrictions(s);
		page.setPageCounter(234);		
		page.setPageIsRedirect((byte)1);
		page.setPageIsNew((byte) 1);
		page.setPageRandom(12);
		page.setPageTouched(s);
		page.setPageLatest(1);
		page.setPageLen(3);
		
		pageDao.persist(page);
		 long tempoFinal = System.currentTimeMillis();  
		
			
	   
	    System.out.println( tempoFinal - tempoInicial );
	}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/wikidb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="hibernate.search.autoregister_listeners">false</property>
        <property name="connection.pool_size">20</property>
        <mapping resource="hibernate/entity/Revision.hbm.xml" />
        <mapping resource="hibernate/entity/Page.hbm.xml" />
        <mapping resource="hibernate/entity/Text.hbm.xml" />
    </session-factory>
</hibernate-configuration>

2 Respostas

von.juliano

O problema é que você está incluido a criação da SessionFactory nessa avaliação. Essa classe é muito pesada, e sua instanciação é muito lenta, devido aos recursos que ela carrega. Remova-a da avaliação, e aí você terá os dados que precisa.

Flw! :thumbup:

marcellandrade

Valew von.juliano. Era isso mesmo. Coloquei para medir o tempo somente no metodo salvar e deu uns 164 milisegundos.

Criado 1 de setembro de 2011
Ultima resposta 2 de set. de 2011
Respostas 2
Participantes 2