Pessoal,
Boa tarde!
É o seguinte. Preciso gerar um relatório em PDF. No entanto a lista (variável no código: ds) que eu passo para o JasperFillManager.fillReport possui umas 300 mil linhas! Estava acontecendo estouro de memória, que eu consegui resolver buscando apenas um campo que realmente interessa, em vez de pegar todos os campos a tabela. O problema é que o relatório demora uns 8 minutos para ser gerado. Como eu faço pra gerar o relatório mais rapidamente?
Ah sim, o gargalo está nessa linha.JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
O jrxml demora apenas 3 segundos para ser compilado.
Por favor, ajudem!
Obrigada.
public String gerarRelatorioPDF(List lista, String format, String source) {
String resultado = FALHA;
// Valida os parametros do relatório
assert !GenericValidator.isBlankOrNull(format);
assert !GenericValidator.isBlankOrNull(source);
List reportData = lista;
Map parameters = new HashMap();
parameters.put(REPORT_FORMAT, format);
parameters.put(REPORT_WEBDIR, getServletContext().getRealPath("/"));
try {
// Carrega o xml de definição do relatório
InputStream is = getServletContext().getResourceAsStream(source);
// Monta um data source baseado na lista retornada
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(reportData);
// Configura o response para suportar o relatório
getResponse().setContentType(REPORT_CONTENT_TYPE_PDF);
getResponse().addHeader(REPORT_CONTENT_DISPOSITION, REPORT_CONTENT_ATTACHMENT_PDF);
// Carrega o relatório
JasperDesign jasperDesign = JRXmlLoader.load(is);
// Compila o relatório
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
// Preenche o relatório com os parametros e o data source
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
// Exporta o relatório
JasperExportManager.exportReportToPdfStream(jasperPrint, getResponse().getOutputStream());
// Salva o estado da aplicação no contexto do JSF
getFacesContext().getApplication().getStateManager().saveSerializedView(getFacesContext());
// Fecha o stream do response
getFacesContext().responseComplete();
// Retorna
resultado = SUCESSO;