Consumo de memória com Jasper Reports

Bom dia Pessoal,

Gostaria de saber se alguém sabe como reduzir o consumo de memória do Jasper Reports.
É uma aplicação Web e quando chamo um relatório consome muita memória java, mas muita mesmo, quando faço uma pesquisa que envolvam mais de 2 tabelas.
Relatório que tenha pesquisa em uma única tabela, por maior que seja e mesmo que tenham milhares de registros, consome muito pouco.
É só combinar 2 tabelas que o consumo sobe exponencialmente. Três então fica totalmente inviável.
Ou alguém conhece alguma alternativa fácil de usar e que não dependa de um ambiente gráfico no servidor Web. Digo isso porque tentei usar o JasperViewer do Jasper Reports e necessitava que o servidor tivesse um ambiente gráfico. Hoje eu mando visualizar direto em PDF no navegador.
Um detalhe, no desenvolvimento local, nna minha máquina Windows, com ou sem JasperViewer, o consumo é o mesmo, ou seja, enorme.

Agradeço desde já.

Abraços,
Zovao

Ola Zovao,

Ja tive problemas com memoria e geração de relatórios complexos no Jasper, da uma olhada na classe JRSwapFileVirtualizer.

Espero ter ajudado.

abraço.

O relatório está fazendo a consulta ?
Não teria como fazer a consulta no programa e só passar os dados para o relatório visualizar ?

Olá Lellis e Lele_Vader,

Eu já tentei a virtualização como Lellis falou, mas não aliviou. Monitorei a memória e gastou o mesmo.

Lele_vader, eu montei um relatório no iReport (jrxml).
No programa eu crio uma ResultSet (ex: rs) que fez a pesquisa e passo como parãmetro

JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );

Crio uma hashmap de parâmetros e depois chamo

JasperPrint p = JasperFillManager.fillReport(nomeDoRelatorio, parameters, jrRS);
JasperExportManager.exportReportToPdfFile(p, nomeRelPdf);
res.sendRedirect(nomeRelPdf);

Passar parâmetros para a parte do cabeçalho, tudo bem, eu já faço.
Eu não sei como passar os parâmetros para a parte iterativa do relatório (Detalhes do relatório), ou seja, a parte que apresenta colunas tipo: código, descrição, etc,
onde cada coluna por vir de tabelas diferentes.

Muito obrigado amigos.

Se alguém souber, agradeço desde já.

Abraços,
Zovão

E o que deixa grande é a consulta não é ?
Eu talvez tentaria deixar a consulta no programa mesmo e passaria um jrcollectiondatasource, com a sua estrutura mapeada, porém não sei se você pode fazer isso.
Também não sei se daria ganho, pois a consulta iria demorar do mesmo jeito, porém o relatório não iria pesar.

Sim, o que consome a memória é a consulta cruzada entre as tabelas, mas dentro do relatório Jasper.
Quando faço a consulta somente dentro do programa para exibir num html, consome muito menos.
O problema é que o pessoal quer o resultado num pdf ou algo assim.
E o servidor, pra ficar leve, nem suporta mecanismos gráficos como o JasperViewer (e nem adianta, porque testei local no windows e consumiu igual).
Vou estudar esse “jrcollectiondatasource”.
Obrigado amigo!!!

Abraços,
Zovao

Uso dezenas de relatorios com varias tabelas e nao tenho esse problema, essas tabelas possuem muitos registros? quantos?

[]'s

Olá Maurício,

Não tem muitos registros. Mas basta fazer um consulta do tipo
"SELECT * FROM pedido,pedidoitem,cliente where pedido_numero = pedidoitem_numero and pedido_clientecod = clientecod order by pedidoitem_numero"
que a memoria java explode.
Eu configurei 700 MB de memória máxima para o Java e deu Java heap space.
São 3 ou até 4 tabelas com where relacionando-as.

Não liga para o sql… é só um exemplo. Nem vi se tem erro de sintaxe.
Estou fazendo algo errado?

Obrigado

Abraços
Zovao

Olá Pessoal,

Alguém sabe?
Não é a consulta SQL pelo programa java, mas quando eu passo essa consulta para o JasperReports fazer.

[]'s
Zovao