Problemas de performance com JPA e toplink [RESOLVIDO]  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
Dieval Guizelini
Virtual Machine Man
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 570
Localização: Curitiba - PR
Offline

Senhores,

tenho um programa que lê um arquivo texto (tamanho médio 20Mb), que faz um parse desse arquivo e insere os dados em um banco mysql (com todas as tabelas no formato myisam e a maioria com registro de tamanho fixo).

O procedimento de carga leva em média 100ms.

O parse leva em média 120ms.

A carga do banco está levando em média 26 minutos.
Sendo que se eu gerar um arquivo com os comandos insert e roda no console (mysql) a carga não leva dois minutos

a unidade de persistência, os controladores e as classe de entidades foram todas criadas automaticamente pelo netbeans.

Exemplos:

persistence.xml (removi as demais referências de class para simplificar)


Um exemplo de uma classe Entity:


E um exemplo do controlador:


Alguém tem alguma sugestão?

vw

Ps: versões:
Java 6u17
Netbeans: 6.7.1
Mysql: 5.1.36

This message was edited 1 time. Last update was at 09/11/2009 19:21:08


Sun Certified Java Programmer 5.0
[WWW]
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

Primeiro, use um Profiler pra ver se é mesmo na parte de JPA. As vezes pode ser outra coisa (mas parece que é no JPA mesmo).

A primeira coisa que eu faria ao pegar esse código é jogar pra fora o getEntityManager no método create (não jogar fora... eu quis dizer jogar pra fora do try). Quando você chama o create, você persiste 1 de cada vez? Porque você poderia persistir em 'lotes' e depois dar o commit. Veja se você não está criando a GenesJpaController mais de uma vez (a criação da Factory é violentamente cara).

Tem como mostrar o código que chama o create?

Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
Dieval Guizelini
Virtual Machine Man
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 570
Localização: Curitiba - PR
Offline

Opa André,

valeu pelas dicas,

mas o create está fora mesmo do laço.

A solução que encontrei e os passos que segui foram estes:

Escrevi todas as classes de persistência, usando JDBC mesmo, segue o modelo da classe de conexão:



Uma classe DAO...



As partes comentadas foram as otimizações que tentei...

Bom, com isso eu sai de 26min e fui para 23min em média.
Mas permitiu eu descobrir que o Driver JDBC que eu estava utilizando do MySQL (que vem junto com o netbeans 6.5) tem um bug, para campos char(1), aparentemente ele fazia substring(0,1)... atualizei o driver para a versão 5.1.10.

Ainda com problemas, removi o máximo de consultas que fazia, criando cache (hashmap) local das tabelas de pouco registros, quando o tipo desejado não é localiza, eu repito a pesquisa no banco, se achar eu atualizo o cache. O que provavelmente escondeu algum select criado pelo JPA que estava sendo executado sem o uso correto de índices no banco.

Fiz mais umas mudanças para persistir os objetivos que possuem listas de detalhes, usando ps.addBatch()... bom para resumir, estou com tempo de 1minuto e 36 segundos, bem melhor hehe.

Exemplo do addBatch() http://www.hiteshagrawal.com/java/mysql-batch-insertupdate-in-java

vw pessoal.



This message was edited 2 times. Last update was at 09/11/2009 19:04:55


Sun Certified Java Programmer 5.0
[WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team