Inicial > programação > Como evitar OutOfMemoryException ao gerar relatórios com o JasperReports

Como evitar OutOfMemoryException ao gerar relatórios com o JasperReports

Aqui onde trabalho temos alguns relatórios muito pesados em sistemas grandes como Controle de Patrimônio e Controle de Estoque. Ao gerá-los em sua totalidade – sem a aplicação de um filtro que diminua a quantidade de informações retornadas – pode acontecer um estouro no Heap, pois, com pouco mais de 1 ano de utilização do sistema, há muitos dados cadastrados no banco de dados. A mensagem de exceção que aparece (todos que trabalham com desenvolvimento em Java já conhecem) é a seguinte: OutOfMemoryException: Java heap space.

Pesquisando um pouco na internet, descobri que há uma classe chamada JRFileVirtualizer que cria arquivos swap em disco, evitando que todas as informações sejam jogadas na memória e prevenindo que aconteça uma exceção do tipo OutOfMemoryException. A sua passagem para o relatório é feita de forma simples através do parâmetro REPORT_VIRTUALIZER.

Observando o construtor da classe JRFileVirtualizer vemos que há dois construtores disponíveis para utilização: um que recebe o tamanho da página em cache e outro que, além dessa variável, recebe também o diretório em que serão salvos os arquivos. Assim, o código para gerar um relatório com virtualização seria da seguinte forma:

// cria um Map para armazenar os parâmetros a serem passados para o relatório
Map<String, Object> parametros = new HashMap<String, Object>();

// salva os arquivos swap em disco, na pasta temporária do Sistema Operacional
JRFileVirtualizer fileVirtualizer = new JRFileVirtualizer(10, System.getProperty("java.io.tmpdir"));
parametros.put(JRParameter.REPORT_VIRTUALIZER, fileVirtualizer); // coloca o objeto nos parâmetros passados o relatório

// gera o relatório com conexão e passando o parâmetro configurado anteriormente
JasperFillManager.fillReportToFile("nome_do_arquivo_jasper.jasper", parametros, getConexao());

Nesse código há ainda uma dica de como obter a pasta temporária do sistema operacional: basta pegar a propriedade do sistema “java.io.tmpdir”.

É importante ressaltar também que após a finalização do objeto JRFileVirtualizer os arquivos swap são removidos, evitando um acúmulo indesejável em disco.

Referência:
Blog do Daniel Souza – http://www.danielsousa.com.br/wp/tag/jasperreport/

Anúncios
  1. 14/06/2010 às 12:22

    Dica muito útil para gerar relatórios sem filtros de tabelas com muitos dados. O JasperReports realmente possui muitas funcionalidades que não usamos, pois as desconhecemos.

  2. 30/11/2010 às 22:55

    put essa eu nao sabia tb, eh jasperReport tem tanta coisa que acho que vou dar uma olhada mais a fundo nos topicos que nao li do livro que tenho.
    Parabens pablo pela dica.

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: