É possível fazer cache em disco em vez de memória com o Hibernate?

3 respostas
D

Bom dia pessoal,

Estamos tendo problema com um módulo de uma aplicação devido ao grande volume de dados manipulados. A aplicação processa algumas centenas de milhares de registros dentro de uma transação. Cada registro, à medida que é processado dentro de um Iterator, precisa ter alguns atributos atualizados. Uma vez atualizados esses atributos o registro é gravado através de uma chamada ao método saveOrUpdate(Object obj). Essa situação no entanto está provocando um ‘Out of Memory’ error.

Um colega comentou comigo que acredita que o Hibernate possa ser configurado de forma que ele mantenha os objetos manipulados dentro da transação em disco em vez da memória o que - teoricamente - resolveria o problema do ‘Out of Memory’.

Alguém sabe me dizer se isso é realmente possível de ser feito? Outras sugestões para solucionar o problema também são bem vindas.

Obrigado.

3 Respostas

_fs

Aqui tem algumas dicas, recomendo que leia tudo:
http://www.hibernate.org/hib_docs/v3/reference/en/html/batch.html

D

É o seguinte, não sei qual servidor está utilizando, mas se for o tomcat por exemplo, por default ele utiliza um pool de memória para variáveis java de 32 Mb (se n me engano), e outros servidores tem o seu valor padão, mas tem como vc modificar isso no servidor aumentando a quantidade de memória para utilização:

Para o Apache Tomcat é o seguinte, vc tem que criar uma variável de ambiente:
Nome Variável: JAVA_OPT
Valor: -client -server -Xms[VALOR_INICIAL]M -Xmx[VALOR_FINAL]M.

Por exemplo:

Se vc quer reservar um intervalo na memória para utilização do tomcat entre 32 MB e 128 MB vc deverá criar a varíável de ambiente assim:

Nome da Variável: JAVA_OPT
Valor: -client -server -Xms32M -Xmx128M

Daniel Eduardo

Mauricio_Linhares

Objetos manipulados dentro da transação sempre ficam em memória, no cache de primeiro nível, apenas os objetos que ficam no cache de nível 2 podem ser enviados pro disco.

Se o link que o LIPE lhe passou não resolver o problema, você vai ter que ficar dando Session.evict() nos objetos que não precisam mais estar disponíveis na transação. Assim você vai conseguir liberar alguma memória.

Criado 26 de junho de 2006
Ultima resposta 26 de jun. de 2006
Respostas 3
Participantes 4