Performance + Hibernate + JPA x SQL e Store Procedures

Estava tendo uma discução “amigável” com meu DBA (o que acontece sempre) e ele levantou uma questão que julgo, bastante importante, mais não tive conhecimento para respondê-lo.

A performance do banco de dados.

Eu uso Mysql + JPA + Hibernate.

Minha dúvida é a seguinte: Usando a camada de persistência (no caso Hibernate + JPA), consigo ter a mesma performance que em JDBC ou SQL e Store Procedures do banco de dados?

Não quero me me entendam mal, sei que a camada de persistência, adianta e gerência muito mais do que se eu fosse fazer tudo na “unha”, mais a questão é a performance.

Pense em consultas de 10 ou 15 milhões de registros…

e ai pablo…

Cara, estes dias atras estava com uma discussão um tanto que… parecida.
Se eu fizer uma busca com com JPA trazendo uma lista de POJOS é mais rapido que fazer uma busca escrevendo HSQL na unha.

Então fiz um teste com uma tabela simples, 4 campos simples sem relacionamento com 500.000 registros.
A diferença foi pequena:

  • 10 segundos trazendo uma lista de POJOS
  • 8 segundos construindo uma HSQL.

Quero fazer testes usando tabelas com mais campos e com relacionamentos, e depois com jdbc puro.

Faça uns testes também, e depois postas os resultados aí…

me disseram que em desempenho nada se compara com as store procedure… teoricamente faz sentido.

Teoricamente uma stored procedure deveria ser mais rapido. Mas usar elas torna um sistema muito dependente de um banco, o que acho não ser uma boa ideia.

concordo com o amigo de cima, com o uso de stored procedures, a aplicação fica muito dependente do banco.
atualmente, trabalho em dois projetos, um utilizando jpa+hibernate e outro sql e stored procedure na camada de persistência.
o fato é, com jpa+hibernate o desenvolvimento é muito rápido, mas a performace não é lá essas coisas, ocorrendo exatamente o contrário, criar as consultas na mão, atrasa um pouco o desenvolvimento, porém, ganhamos em desempenho.
se sua aplicação precisa de uma alta performace, stored procedure, mesmo que sua aplicação fique dependendo totalmente do banco. Até porque, não conheço nenhuma empresa que inicie um projeto com um banco e depois queira trocá-lo assim do nada.
cada caso é um caso, ambas as formas têm suas desvantagens e vantagens.

Também acho que a utilização de Stored Procedures pode aumentas “um pouco mais” a dependência do banco de dados.
Mas pensando num mundo corporativo, e isso eu dificilmente vejo na maioria dos POST, qual a probabilidade de uma instituição financeira, mudar o banco de dados?
Qual a probabilidade de uma empresa de varejo que use DataWare House, troca de um Oracle para um DB2, ou vice-versa?
Bem, pela minha experienca, é nula! Nunca vi ou ouvi algo do genero acontecer.
Pensando como um arquiteto de sistemas, a escolha entre usar ou não stored procedures está mais voltada para cada sistema, e não como uma verdade absoluta!
Eu particularmente continuo fã de stored procedures, e em nenhum teste que eu tenha feito a performance de procedures foi inferior a 15%, nos piores casos, ja tive ganhos de 70% em relação ao Hibernate.
Trabalhei uma vez com pacote empresarial totalmente customizado utilizando procedures, a diferenca é que para tornar o pacote multibanco, a empresa resolveu migrar as procedures, ou seja, existia um pacote de procedures para Oracle e DB2.
Nas soluções que eu projeto, se a performance de banco (geralmente ocorre em soluções corporativas) for crucial eu utilizao procedures sem a menor dor de consciencia.
Agora, se é uma solução departamental, claro que optar por JPA ou Hibernate ou Spring é a solução mais confortavel, ja que a performance no tratamento de dados não é ponto critico.
Agora, vai no diretor de um Citibank, e diz pra ele que a sua solução de arquitetura vai ter que processar 1M de registros a menos por segundo, pq vc não quer usar procedures e prefere usar um framework de persistencia! KKKKKKKKKKKk

[]´s
Mike Moreira

Revivendo o tópico, se utilizarmos hibernate com uso coerente de relacionamentos EAZY e LAZZY, cache de segundo nível e etc o hibernate não se equivale ou supera o uso de Stored Procedures?