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.
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.
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!!!
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?