Java Heap Space em consultas ao banco  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thiagofesta
JavaGuru
[Avatar]

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
[WWW] [Yahoo!] [MSN]
alevi
JavaChild
[Avatar]

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
thiagofesta
JavaGuru
[Avatar]

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
[WWW] [Yahoo!] [MSN]
thiagofesta
JavaGuru
[Avatar]

Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline

Não deu certo!


Em anexo tem um print screen
[Thumb - h.jpg]
 Nome do arquivo h.jpg [Disk] 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
[WWW] [Yahoo!] [MSN]
alevi
JavaChild
[Avatar]

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
thiagofesta
JavaGuru
[Avatar]

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
[WWW] [Yahoo!] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team