Sem memória usando Postgres em Java

votos
2

Bem, temos uma aplicação web, correndo JBoss e nós estamos tendo um erro OutOfMemory ao tentar inserir um monte de linhas em várias tabelas de um DB postgres. Este é o ambiente completo para este erro:
* JBoss 4.3.x GA
* Java 1.6.0
* Hibernate 3.0
* postgreSQL-8.3 (driver)
Sobre ambiente de código de trabalho real:
* A parte pesada sobre isso é que nós estamos analisando enorme quantidades de documentos XML cada um baixado separadamente a partir de uma URL específica (1 URL = 1 XML). Nós realizamos que por ter um EJB que distribui os URLs gerados para uma fila, em seguida, uma piscina de MDBs conectar usando correntes e gera os documentos (note que de fato, tivemos de levantar memória de pilha devido ao tamanho documentos XML, e estamos preso com ter que começar todo o documento em um fluxo), uma vez que o documento é gerado ele vai para outra fila, onde outra piscina MDB escuta.
Esses MDBs analisar o doc, armazenar informações em várias entidades (5 pelo menos) que, em seguida, são persistentes no DB (note que o gerenciamento de transações está definida como feijão e é iniciada e comprometida durante cada MDBs trabalhar). Processamento de URLs sequencialmente não é uma opção por causa da quantidade de URLs a serem processados, que levaria como 2 meses ou mais ... lol

O problema é ... que nós analisar e armazenar como 200 URLs ou assim e começar a sair do erro de memória para o PostgreSQL. Alguma ideia??

Desde já, obrigado!!

TAMBÉM: Pode ser útil saber que esse erro não estava saindo antes (eu fiz analisar alguns milhares de que XML befor), apenas a geração de documentos e analisar alguns dos-lo em algumas entidades não parecia trazer problemas. Problemas começaram quando começamos a analisar mais e mais do doc nele das entidades correspondentes. (Como uma entidade ter uma lista de características [outra entidade analisado a partir do mesmo xml])

Publicado 17/12/2008 em 14:04
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Isso soa como você a manter todos os grãos para todos os 200 documentos na memória.

Em vez de manter todos os dados na memória RAM todo o tempo, tentar se livrar dele o mais rápido possível.

Então, quando você é feito com a leitura dos dados por algum feijão, persistem-lo e depois esquecê-la (definir a referência de objeto para null) exceto talvez para a chave que você precisa para criar referências.

Se você não pode fazer isso, use um profiler para se certificar de que você não manter uma referência a um documento depois de ter analisado nele. Normalmente, você não precisa manter todo o documento em qualquer lugar depois persistência-lo no DB. Se este é um problema, criar uma tabela com referências que permite a ligação entre os documentos e manter apenas as chaves na tabela na memória (em vez de todo o documento).

Respondeu 17/12/2008 em 14:18
fonte usuário

votos
1

A resposta curta é é necessária mais informação. Eu sugiro usar uma ferramenta como JProfiler para ajudar a compreender onde a memória está sendo consumida.

Com base em seu projeto descrito: Por que usar duas piscinas? Se você só tinha uma piscina para os URLs, então segmentos de trabalho conseguimos extrair esse pool, analisar o URL e criar os beans de entidade, poupando-os para o DB.

Não está claro por que você precisa a etapa XML intermediário, que soa como uma provável fonte de alto consumo de memória.

Respondeu 17/12/2008 em 14:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more