Gerar relatório PDF enorme com JasperReport

0 respostas
S

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;
Criado 20 de janeiro de 2010
Respostas 0
Participantes 1