| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 11:38:40
|
thiagofesta
JavaGuru
![[Avatar]](/images/avatar/eff4ceddd4035b36233219a6ea4b889e.png)
Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline
|
Bom dia a todos,
Estou com um sério problema, eu estou fazendo um artigo e uma parte dele é onde faço alguns testes de desempenho, com 3 bancos de dados, o Apache Derby, MySQL e PostgreSQL.
O a estrutura das tabelas são iguais em todos os bancos, existe a tabela Pessoa (possui FK de endereco), e a Endereço, e ambas possuem um índice no nome da pessoa e na descrição do endereço.
São testes: inserção de 1 milhão de registros em cada tabela. busca destes 1 milhão de registros das duas tabelas, e depois com um JOIN.
Com o Apache Derby eu fiz todos estes teste e deu certo.
Com o MySQL chega a cerca de 10 mil registros na tabela Endereço ai já da Java Heap Space.
Com o PostgreSQL ele inseriu nas tabelas, mas não buscou.
Ai eu pensei em aumentar a memória do Java de 128mb até 800mb.
Ai no PostgreSQL deu certo, porém não deu certo a exclusão dos 2 milhões de registros; E no MySQL travou o pc.
O que pode ser?
Segue abaixo as duas classes que uso nos testes.
Irei ser muito grato a quem ajudar, pois preciso concluir o artigo.
|
"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 11:53:08
|
alevi
JavaChild
![[Avatar]](/images/avatar/77d13a096e771552d84d4af5f8ba7980.jpg)
Membro desde: 27/01/2007 13:58:04
Mensagens: 145
Offline
|
Olá Thiago!!
O que acontece com a memória virtual do windows (ou o swap, no caso de Linux)?
Aparentemente, como a conexão não é commitada por instrução SQL, a JVM está armazenando as instruções em memória e está estourando por causa da quantidade.
Tente (sei que não é certo) commitar para cada instrução para ver se funciona (pelo menos garante a lógica do código).
Outra coisa: no MySQL (pelo que me lembro), as tabelas MyISAM não são transacionais - somente InnoDB.
Parece ser mais um problema de implementação do driver JDBC dos bancos do que outra coisa...
This message was edited 1 time. Last update was at 02/06/2009 11:54:54
|
http://www.walkersystems.com.br
SCJP |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 11:57:35
|
thiagofesta
JavaGuru
![[Avatar]](/images/avatar/eff4ceddd4035b36233219a6ea4b889e.png)
Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline
|
alevi wrote:Olá Thiago!!
O que acontece com a memória virtual do windows (ou o swap, no caso de Linux)?
Aparentemente, como a conexão não é commitada por instrução SQL, a JVM está armazenando as instruções em memória e está estourando por causa da quantidade.
Tente (sei que não é certo) commitar para cada instrução para ver se funciona (pelo menos garante a lógica do código).
Outra coisa: no MySQL (pelo que me lembro), as tabelas MyISAM não são transacionais - somente InnoDB.
Parece ser mais um problema de implementação do driver JDBC dos bancos do que outra coisa...
Olá Alevi, uso Linux meu SWAP é de 1gb, mas vou tentar fazer como você disse, comitar a cada instrução.
Outra coisa, e porque será que com consulta do PostgreSQL tive que aumentar? Se você ver o código eu só consulto e guardo no ResultSet.
As tabelas do meu MySQL são InnoDB.
Agradeço desde já, logo mais posto o resultado do novo teste.
|
"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 12:16:19
|
thiagofesta
JavaGuru
![[Avatar]](/images/avatar/eff4ceddd4035b36233219a6ea4b889e.png)
Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline
|
Não deu certo!
Em anexo tem um print screen
|
| Nome do arquivo |
h.jpg |
Download
|
| Descrição |
Erro |
| Tamanho |
83 Kbytes
|
| Baixado: |
44 vez(es) |
|
"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/06/2009 19:04:03
|
alevi
JavaChild
![[Avatar]](/images/avatar/77d13a096e771552d84d4af5f8ba7980.jpg)
Membro desde: 27/01/2007 13:58:04
Mensagens: 145
Offline
|
Olá Thiago!!
Analisei seu código e fiz um teste com o MySQL. Apesar de não ter nada a ver com o problema, verifiquei alguns detalhes:
- a porta do MySQL na abertura de conexão não está sendo informada (default como 3306);
- a montagem da string para data (atributo "current" não estava recebendo um valor;
- falta carregar a classe driver do MySQL com
no construtor da classe Conexao;
Bem, depois de acertado tudo, aí sim deu o Heap Space -
Pesquisei na internet e vi alguns gringos que também tiveram este problema. Aparentemente, realmente se trata de limitações na implementação do driver JDBC para cada banco.
Dê uma olhada neste tópico: http://forums.mysql.com/read.php?39,152636,152761#msg-152761
Outra dica: utilize preparedStatement para evitar problemas na montagem da instrução SQL.
Espero ter ajudado...
Abraços!
|
http://www.walkersystems.com.br
SCJP |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2009 09:50:55
|
thiagofesta
JavaGuru
![[Avatar]](/images/avatar/eff4ceddd4035b36233219a6ea4b889e.png)
Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline
|
Alevi,
Obrigado pelas dicas, vou usá-las.
Apresentei ontem o artigo, a solução foi usar menos registros
É uma pena ser limitado. Não comentei sobre isso na apresentação, mas é interessante comentar, vou ver se consigo comentar sobre isso nas próximas aulas.
Obrigado!
|
"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln |
|
|
 |
|
|
|
|