Baixa performance no Hibernate

3 respostas
C

Caros,

Estive analizando recentemente o desempenho do hibernate, com relação a sua performance, em especial sua velocidade. Por exemplo, para uma simples inserção em um banco de dados, o postgresql, utilizando um codigo para contagem em milisegundos do tempo de execução do mesmo:

-Para o hibernate, o tempo médio de execução foi de aproximadamente 3500 ms (Tres mil e quinhentos milisegundos).
-Para o JDBC puro, foi de aproximadamente, 250 ms (Duzentos e ciquenta milisegundos).

Isso para o mesmo banco de dados e mesma tabela, com os mesmos campos.
Por isso pergundo, qual seria uma boa justificativa, na opinião dos senhores, para utilizar o hibernate, visto que para mudar de banco, dependendo de qual mudança, não são necessárias tantas adquações ao codigo assim?

3 Respostas

onyaszimba

Realmente o JDBC é mais rápido, sem dúvida. Até porque o Hibernate traz o objeto inteiro, sempre.

A vantagem, na minha opinião - e a da maioria, acredito -, é quanto a manuteção do código, pois com o framework você abstrai a parte de SQL.

Imagine uma tabela com 40 campos. E você tem que fazer um simples insert…

String sql = "INSERT INTO tabela(40 campos...) VALUES(?,?,?,?,?,?,?,?,?,?, e dá-lhe ?...)";

PreparedStatement pstmt = con.getPreparedStatement(sql);

pstmt.isso
pstmt.aquilo
...

Dá trabalho, não? Com o Hibernate você passa apenas o objeto:

session.save(objeto);

É um exemplo tosco, mas mostra bem a minha visão do porquê usar o Hibernate. Além de mais produtivo, a manutenção é bem mais simples. Agora, até que ponto o desempenho do Hibernate afeta as aplicações que a utilizam eu não sei, e se afeta de tal modo que seja mais viável usar JDBC. Acredito que não, mesmo não tendo a experiência necessária para afirmar tal coisa.

Do meu ponto de vista, compensa usar o Hibernate.

Paulo_Silveira

Ola Cyberbob

O Hibernate é extremamente rapido, depois de ter sido inicializado. Creio que voce esteja comparado banana e abacaxi ai: levantar a Configuration e em especial a SessionFactory e a Session, demandam tempo pois inicializam uma serie de outras classes, objetos, mapas e caches. Se voce fizer um FOR e inserir diversos objetos, a curva sera suavizada (e lembrar de usar StatelessSession se for fazer um batch de inserts).

De qualquer maneira, para coisas menos basicas, voce tem de tomar cuidado para nao usar o Hibernate de qualquer forma, lembrando que é muito simples fazer o fine tuning com ele. Aqui eu coloquei algumas dicas que eu considero mais interessantes pro dia a dia:

abracos

C

Olá Paulo!

Obrigado pelas dicas e desculpe a demora em responder, estive muito atarefado.

Realmente, para inicializar o hibernate demanda bastante tempo, mas uma vez inicializado, ele realiza operaçoes com uma boa performance, como é o caso do insert.
Mas aproveitando que voce falou em inicializaçao, seri correto, em uma aplicaçao desktop, como um PDV, inicializar o hibernate ao abri-lo e apenas fechar a seçao apos encerrar a aplicaçao? Acho que resolveria o problema.

Criado 27 de setembro de 2009
Ultima resposta 6 de out. de 2009
Respostas 3
Participantes 3