| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/11/2009 10:46:39
|
Dieval Guizelini
Virtual Machine Man
![[Avatar]](/images/avatar/9fc92b9c69b711dcb880ccb743fc6f06.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/11/2009 00:58:03
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/11/2009 19:02:09
|
Dieval Guizelini
Virtual Machine Man
![[Avatar]](/images/avatar/9fc92b9c69b711dcb880ccb743fc6f06.jpg)
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 |
|
|
 |
|
|
|
|