Performance Hibernate e JDBC

Boa tarde pessoal,

estou desenvolvendo meu tcc sobre uma comparação entre Hibernate e JDBC,
e um grande foco do trabalho é sobre performance.

Uma questão que estou sendo muito cobrado é referente a COMO vou realizar esses testes de performance.

Bom, o meu trabalho se trata resumidamente, de possuir dois metodos que fazem consultas ao banco de dados visando buscar X dados,
e essas consultas seriam escritas em hibernate e jdbc, e a partir disso realizar os testes em ambos.

Poderiam me dizer como geralmente são realizados e avaliados testes como esses ?
Quais ferramentas são usadas? Pesquisando achei uma ferramenta que vem junto com o jdk chamada Jconsole, voces acham que essa ferramenta poderia resolver meu problema ?

Muito obrigado :]

  1. Defina os casos de teste
  2. Crie uma massa de teste
  3. Meça a execução dessa massa de teste, usando os métodos citados - pode usar, por exemplo, System.currentTimeMilllis() para medir uma diferença de tempos
  4. Pegue os resultados, ponha em uma planilha, e desenhe um gráfico

Dica: você precisa mais de saber mexer no Excel (ou na ferramenta R ou no Matlab) para gerar as estatísticas e os gráficos, que saber Hibernate ou JDBC.

O jconsole só precisaria ser usado se, em vez de medir só os tempos, você precisasse também medir quanta memória é gasta durante a execução dos seus testes.

O que por sinal, não é uma má ideia :slight_smile: (só minha opinião :))

[quote=entanglement]1) Defina os casos de teste
2) Crie uma massa de teste
3) Meça a execução dessa massa de teste, usando os métodos citados - pode usar, por exemplo, System.currentTimeMilllis() para medir uma diferença de tempos
4) Pegue os resultados, ponha em uma planilha, e desenhe um gráfico

Dica: você precisa mais de saber mexer no Excel (ou na ferramenta R ou no Matlab) para gerar as estatísticas e os gráficos, que saber Hibernate ou JDBC.

O jconsole só precisaria ser usado se, em vez de medir só os tempos, você precisasse também medir quanta memória é gasta durante a execução dos seus testes. [/quote]

Até o momento eu desenvolvi exatamente como voce indicou, medindo o tempo com currentTImeMillis e genando graficos no excel, foi algo que achei interessante fazer,
a massa de testes estou utilizando um banco de dados da mysql chamado sakila, que simula uma locadoura de filmes e tem uma massa legal para brincar.
Porém meu orientador me disse que eu precisava ver se esse realmente era o melhor caminho… e se outro trabalhos faziam dessa maneira, assim referenciando, intende ?

Saberia me informar algum livro ou trabalho que eu posso estar usando para dar base ao trabalho ? Conhece outras alternativas ?

Vlw pela ajuda, abraço

O que por sinal, não é uma má ideia :slight_smile: (só minha opinião :))[/quote]

Acho que também estarei atentando para isso, já que na minha opinião é algo importante também.

Conhece outras ferramentas para testes como o jconsole ?

Coisas que podem bagunçar um pouco o teste.

  1. Opções de compilação da JVM - você pode usar -Xcomp para poder ter resultados mais previsíveis
  2. Opções de quantidade de memória - ajuste uma quantidade grande suficiente de memória para evitar problemas com garbage collection

[quote=entanglement]Coisas que podem bagunçar um pouco o teste.

  1. Opções de compilação da JVM - você pode usar -Xcomp para poder ter resultados mais previsíveis
  2. Opções de quantidade de memória - ajuste uma quantidade grande suficiente de memória para evitar problemas com garbage collection
    [/quote]

Poderia me explicar um pouco melhor como o xcomp poderia ajudar nos resultados ?

Obrigado pela ajuda

Cara, a diferença é tão gritante, dava até de mostrar pra eles que o hibernate é muito mais performático só no feeling de algum usuário utilizando o sistema;

mas já que é tcc né… tem que ter algum gráfico pelo menos. Vc pode então fazer uma comparação do throughput(que é uma das métricas mais importantes em termos de testes de performance) entre a aplicação e o banco de dados e tbm mostrar que quando se usa hibernate consome bem menos I/O entre aplicação e banco de dados. Isso é para explicar o porquê com hibernate é mais rápido.

Agora se vc quer só resultados. (ou os 2)
Vc pode usar o Jmeter para realizar uma carga de consultas para vc, tipo realizar 10 consultas 1000 vezes. e verificar as métricas que ele já tem. E ele também tem gráficos de throughput, médio de tempo de resposta, tempo de resposta mais rápida, tempo de resposta mais demorada, e outros.

[quote=TJvargas]Cara, a diferença é tão gritante, dava até de mostrar pra eles que o hibernate é muito mais performático só no feeling de algum usuário utilizando o sistema;

mas já que é tcc né… tem que ter algum gráfico pelo menos. Vc pode então fazer uma comparação do throughput(que é uma das métricas mais importantes em termos de testes de performance) entre a aplicação e o banco de dados e tbm mostrar que quando se usa hibernate consome bem menos I/O entre aplicação e banco de dados. Isso é para explicar o porquê com hibernate é mais rápido.

Agora se vc quer só resultados. (ou os 2)
Vc pode usar o Jmeter para realizar uma carga de consultas para vc, tipo realizar 10 consultas 1000 vezes. e verificar as métricas que ele já tem. E ele também tem gráficos de throughput, médio de tempo de resposta, tempo de resposta mais rápida, tempo de resposta mais demorada, e outros.[/quote]

Certo, vou dar uma olhada nas dicas,

muito obrigado :]

[quote=TJvargas]Cara, a diferença é tão gritante, dava até de mostrar pra eles que o hibernate é muito mais performático só no feeling de algum usuário utilizando o sistema;

mas já que é tcc né… tem que ter algum gráfico pelo menos. Vc pode então fazer uma comparação do throughput(que é uma das métricas mais importantes em termos de testes de performance) entre a aplicação e o banco de dados e tbm mostrar que quando se usa hibernate consome bem menos I/O entre aplicação e banco de dados. Isso é para explicar o porquê com hibernate é mais rápido.

Agora se vc quer só resultados. (ou os 2)
Vc pode usar o Jmeter para realizar uma carga de consultas para vc, tipo realizar 10 consultas 1000 vezes. e verificar as métricas que ele já tem. E ele também tem gráficos de throughput, médio de tempo de resposta, tempo de resposta mais rápida, tempo de resposta mais demorada, e outros.[/quote]
Amigo… interessante essa observação sua que o hibernate é mais performático só no feeling do usuário, mas infelizmente sempre que fiz este tipo de teste com JDBC e Procedures ficou muito mais rapido que com hibernate!
Quando se envolve cache e outras coisas o cenário pode até mudar… mas eu infelizmente não tive experiências tão boas assim com hibernate!
Tanto que eu só costumo adotar hibernate (e faz tempo que não adoto) em soluções pouco complexas na questão de repositório de dados…

PS: Nunca mexi na versão 4 então talvez esteja precisando rever meus conceitos!

[quote=jmmenezes]Amigo… interessante essa observação sua que o hibernate é mais performático só no feeling do usuário, mas infelizmente sempre que fiz este tipo de teste com JDBC e Procedures ficou muito mais rapido que com hibernate!
Quando se envolve cache e outras coisas o cenário pode até mudar… mas eu infelizmente não tive experiências tão boas assim com hibernate!
Tanto que eu só costumo adotar hibernate (e faz tempo que não adoto) em soluções pouco complexas na questão de repositório de dados…

PS: Nunca mexi na versão 4 então talvez esteja precisando rever meus conceitos![/quote]
Poderia compartilhar exatamente sua experiência negativa sobre o Hibernate para saber se precisa rever. É um framework bem rico e flexível, onde cada caso deve usar o recurso ideal, como você mesmo falou sobre usar cache ou não por exemplo. Aqui rolou uma discussão sobre isso: http://www.guj.com.br/java/210953-hibernate-e-desempenho#1591538 onde seria uma boa caso queira expor sua experiência, ou também não sei se já falou algo la.

feharaujo, sobre seu TCC, não foque só em desempenho senão JDBC puro sempre vai ganhar pois obviamente estará fazendo algo otimizado. Acho penoso usar OOP com banco de dados relacional sem um ORM e nem tudo precisa de extremo desempenho, senão o próprio Java estaria em questão. Falar de outros ORMs também iria enriquecer seu trabalho, existem outras opções mais leves que o Hibernate, embora menos usadas no mercado.

[quote=javaflex][quote=jmmenezes]Amigo… interessante essa observação sua que o hibernate é mais performático só no feeling do usuário, mas infelizmente sempre que fiz este tipo de teste com JDBC e Procedures ficou muito mais rapido que com hibernate!
Quando se envolve cache e outras coisas o cenário pode até mudar… mas eu infelizmente não tive experiências tão boas assim com hibernate!
Tanto que eu só costumo adotar hibernate (e faz tempo que não adoto) em soluções pouco complexas na questão de repositório de dados…

PS: Nunca mexi na versão 4 então talvez esteja precisando rever meus conceitos![/quote]
Poderia compartilhar exatamente sua experiência negativa sobre o Hibernate para saber se precisa rever. É um framework bem rico e flexível, onde cada caso deve usar o recurso ideal, como você mesmo falou sobre usar cache ou não por exemplo. Aqui rolou uma discussão sobre isso: http://www.guj.com.br/java/210953-hibernate-e-desempenho#1591538 onde seria uma boa caso queira expor sua experiência, ou também não sei se já falou algo la.

feharaujo, sobre seu TCC, não foque só em desempenho senão JDBC puro sempre vai ganhar pois obviamente estará fazendo algo otimizado. Acho penoso usar OOP com banco de dados relacional sem um ORM e nem tudo precisa de extremo desempenho, senão o próprio Java estaria em questão. Falar de outros ORMs também iria enriquecer seu trabalho, existem outras opções mais leves que o Hibernate, embora menos usadas no mercado.[/quote]

Certo, estou tentando mostrar os beneficios tambem, como voce mesmo disse, ja que somente desempenho jdbc realmente vai ficar mais rapido (pelo menos em poucos teste que fiz ate agora foi),
vamos ver oque sai, ja que realmente é muita coisa para ser analisada hehe ,
obrigado pela dica,

abraços

Bem, quando eu li performance não achei que estavam falando simplesmente de tempo de resposta de uma consulta ou um insert; O que de fato é mais rápido usando direto jdbc.

E isso não traduz performance para a sua aplicação, e foi isso que achei que se tratava;

E o tipo de operação mais pesa nos sistemas enterprise normais são que envolvem banco de dados, e o hibernate diminui esse contato com o banco por meio de proxies, cache L1 e L2, e isso sim, na maioria dos casos, traduz performance;

[quote=TJvargas]Bem, quando eu li performance não achei que estavam falando simplesmente de tempo de resposta de uma consulta ou um insert; O que de fato é mais rápido usando direto jdbc.

E isso não traduz performance para a sua aplicação, e foi isso que achei que se tratava;

E o tipo de operação mais pesa nos sistemas enterprise normais são que envolvem banco de dados, e o hibernate diminui esse contato com o banco por meio de proxies, cache L1 e L2, e isso sim, na maioria dos casos, traduz performance;[/quote]
Bem lembrado, isso em aplicação desktop faz diferença notável sim, já web pelo fato de já ter que ir em algum servidor da mesma rede de qualquer maneira e acaba não fazendo diferença plausível em muitos casos. Tem muito do fator “feeling” que já falaram aqui. Uma coisa que uso muito em situações especiais como consultas e relatórios é StatelessSession que deixa “o Hibernate” bem mais leve, economizando memória e processamento, isso é muito importante em uma aplicação web.

Boa noite,

Apimentando essa discussão,

sou estudante de computação e estou realizando uma pesquisa sobre o mapeamento objeto-relacional com o Hibernate, na qual, após alguns testes, constatei que o Hibernate mostrou um desempenho superior ao JDBC puro, em todas as operações CRUD, ao ser utilizado acesso concorrente ao banco de dados. Em contra partida o JDBC puro se mostrou bem melhor do que o Hibernate quando os testes foram feitos com poucos acessos simultâneos. Já pesquisei, sem sucesso, justificativas para tal resultado. O meu questionamento é: porque o Hibernate obteve maior estabilidade e melhor desempenho do que o JDBC puro, à medida que a quantidade de acesso simultâneo ao banco de dados cresce? Obrigado.

tudo depende do programador, na verdade eu também fiz uma análise de tcc, chamada análise e comparação de frameworks de persistência. Notei que o Hibernate tem um ferramental tão gigante que pode deixar o jdbc no chinelo valendo pois tem muitos recursos de otimização.