| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/08/2007 10:24:36
|
diegodrumondPJ
JavaChild
![[Avatar]](/images/avatar/1)
Membro desde: 15/08/2004 00:00:00
Mensagens: 100
Localização: 81427317
Offline
|
Boa tarde galera... eu estou iniciando agora com JPA a comecei a enfrentar alguns problemas.. possuo uma tabela com uns 30mil registros e preciso ler um a um e fazer algum tipo de processamento... segue abaixo o codigo:
algumas observacoes:
1 - o trecho de codigo
foi escrito desta forma pois fazendo o createNamedQuery e setMaxResults fora do loop, ele listava todos os registros. pq? sei lah... existe forma de fazer isso?
2 - a transacao foi ativada numa tentativa frustrada de dar em.flush()
Os problemas:
1 - apos processar qse 5 mil registros, ocorre um OutOfMemory... alguem sabe me explicar pq?
2 - a coisa mais bizarra do mundo: algumas vezes o getResultList retorna mais de 1000 registros... o.O
Estou utilizando o netbeans 5.5.1 e o Oracle TopLink Essentials - 2.0 (Build b41-beta2)... estou usando o banco de dados firebird 1.5.4 e o driver jdbc JayBird JCA/JDBC 1.5.5...
Alguem poderia me explicar o pq desses problemas, como corrigir ou se existe alguma outra forma de listar tds os registros de uma tabela sem dar OutOfMemory? Isto é problema da jpa ou do driver JDBC?
vlws...
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/08/2007 14:18:56
|
luBSPJ
Virtual Machine Man
![[Avatar]](/images/avatar/0)
Membro desde: 29/05/2004 00:00:00
Mensagens: 718
Offline
|
Eu acho que seu problema (de OutOfMemory) esta na transação, tudo esta sendo feito numa unica transação.... isso quer dizer que nada vai ser comitado no banco e tudo que vc "processar" vai ficando em memoria.
Explicando melhor, ele vai carregando os registros (com paginação), vc processa ele, salva, mas não comita a transação, então o objeto ficou na session, e ai vai indo, agrupando tudo até que falta memoria...
não tem como vc processar em partes?! tem que ser tudo feito dentro da mesma transação?
e se vc listar apenas, não processar os registros, tira transação fora e somente listar, da erro?!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/08/2007 14:35:55
|
diegodrumondPJ
JavaChild
![[Avatar]](/images/avatar/1)
Membro desde: 15/08/2004 00:00:00
Mensagens: 100
Localização: 81427317
Offline
|
observe q a transacao esta fora do codigo do processamento... esta no bloco de codigo q cria a sessao jpa... isso pq testei das duas formas... possuo um codigo mais enxuto q apenas percorre todos os registros da tabela, utilizando a msm namedQuery do outro metodo:
ocorre o msm erro:
ps: este output foi gerado sem a utilizacao de transacao.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/08/2007 17:09:59
|
luBSPJ
Virtual Machine Man
![[Avatar]](/images/avatar/0)
Membro desde: 29/05/2004 00:00:00
Mensagens: 718
Offline
|
tah e seu bloco de processamento é chamado no bloco que criou a transação, e vc usa para fazer as consultas o EntityManager que foi usado para iniciar a transação, logo, sim, seu processamento esta dentro de uma transação.
Bem, mas se vc testou sem transação e tb deu erro.... vou fazer um teste igual o seu quando chegar em casa (to sem tempo agora no trabalho), ai te respondo.... mas eu ja fiz consultas em tabelas com 200 mil registros usando JPA com paginação e deu certo... deve ser algum detalhe que não vimos ainda.... vou testar...
ps: a implementação que usei na epoca era Hibernate
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/08/2007 22:00:37
|
luBSPJ
Virtual Machine Man
![[Avatar]](/images/avatar/0)
Membro desde: 29/05/2004 00:00:00
Mensagens: 718
Offline
|
Não sei, testei aqui o mesmo programa que o seu, acessando uma tabela com 5 colunas e 39 mil registros e não deu erro.
Só que no meu caso usei hibernate e mysql, to meio sem tempo e saco de baixar o toplink e testar com ele.
Sera que essa sua "ClassePOJO" não tem muitos mapeamentos EAGER para Set que esta carregando demais?!
Posta essa classe para eu ver mais ou menos... e faz uns testes iniciando a paginacao la pelo 10000 +- (i=100)... da uma olhada se dessa forma consegue listar mais registros.
flw
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2007 13:32:14
|
diegodrumondPJ
JavaChild
![[Avatar]](/images/avatar/1)
Membro desde: 15/08/2004 00:00:00
Mensagens: 100
Localização: 81427317
Offline
|
eu fiz a coisa mais absurda e ridicula do mundo em um momento de desespero... kkk.. mas funcionou.. claro q eu nao to afim de deixar o codigo assim... eu acho q o problema eh o driver JDBC do firebird... mas vou postar a alteracao grotestaca q fiz.. kkkkk
o pior.. esse lixo funcionou.. kkk.. processou meus 30mil registros...
qnto ao pojo ele possui mtos relacionamentos EAGER msm.. vou modificar pra LAZY e ver se melhora...
vlws...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2007 13:36:09
|
diegodrumondPJ
JavaChild
![[Avatar]](/images/avatar/1)
Membro desde: 15/08/2004 00:00:00
Mensagens: 100
Localização: 81427317
Offline
|
observei os mapeamentos ake.. mas a grande maioria dos relacionamentos eu utilizo no processamento das informacoes.. e agora? :S
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/08/2007 14:34:51
|
diegodrumondPJ
JavaChild
![[Avatar]](/images/avatar/1)
Membro desde: 15/08/2004 00:00:00
Mensagens: 100
Localização: 81427317
Offline
|
resolvi ake \o/
fiz algumas alteracoes ake q contribuiram... foram elas:
- trokei o driver JDBC para uma versao classe 4 - nao fez diferenca nenhuma aparentemente.. kkk
- trokei o toplink pelo hibernate - uma grande diferenca... o toplink processava apenas uns 5mil registros antes de dar OutOfMemory... o hibernate processou 12mil... apesar dos mapeamentos terem dado mto pau.. kkk(nao era pra funcionar nos dois?? o.O)
- e por ultimo, e mais importante, enfiei um em.clear() lah no meio do codigo.. ficou lindo.. e da forma como eu qria...
de qualquer forma obrigado pela ajuda luBS....
vlws
|
|
|
 |
|
|