Estourando memoria com jasperreport?

2 respostas
A

Foi o que entendi quando vi a exceção gerada quando executei uns testes com a classe abaixo.
A exceção foi essa:

Detalhe: a tabela que estou lendo tem mais de 45.000 registros. Consigo executar a classe trazendo até uns 24.000 registros, quando passo para 25.000 é que acontece essa exceção.

O código é esse aí. Se alguém puder dar uma força…

import java.sql.*;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
import net.sf.jasperreports.engine.JRExporterParameter;
import java.io.OutputStream;

public class RelatorioTransacoesExcel
{
	// método construtor
	public RelatorioTransacoesExcel()
	{
	} // fim do método construtor

	public static void main( String args[] )
	{
		runReport( "jdbc:oracle:thin:@localhost:1521:beckwith", "dbadmin", "dbadmin", "RelatorioTransacoes.jasper" );
	}

	// método que retorna conexão com o banco de dados
	public static Connection conexaoBD( String banco, String usuario, String senha )
	{
		Connection conexao = null;
		try
		{
			Class.forName( "oracle.jdbc.driver.OracleDriver" );
			conexao = DriverManager.getConnection( banco, usuario, senha );
		}
		catch( Exception ex )
		{
			String mensagem = "Falha na conexão com banco: "+ ex.getMessage() + " " + ex.getLocalizedMessage();
			System.out.println( mensagem );
		}
		return conexao;
	} // fim do método conexaoBD

	public static void runReport( String banco, String usuario, String senha, String relatorio )
	{
		try
		{
			Connection conexao = conexaoBD( banco, usuario, senha );
			JasperPrint jasperPrint = JasperFillManager.fillReport( relatorio, null, conexao );
			JRXlsExporter exporterXLS = new JRXlsExporter();

			exporterXLS.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
			exporterXLS.setParameter( JRExporterParameter.OUTPUT_FILE_NAME, "Novoteste.xls" );

			exporterXLS.setParameter( JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE );

			// parâmetro que exibe as linhas de grade das células no excel
			exporterXLS.setParameter( JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE );

			// parâmetro que remove linhas em branco geradas pela quebra de página
			exporterXLS.setParameter( JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE );
			exporterXLS.exportReport();
		}
		catch( Exception ex )
		{
			String mensagem = "Falha na criação do relatório " + ex.getMessage() + " " + ex.getLocalizedMessage();
			System.out.println( mensagem );
		}
	}
}

2 Respostas

M

Isso aconteceu porque o Heap da JVM estourou.
tenta compila pelo prompt de comando:

java -Xms128m -Xms256m nomeDaClasse

Os parametros passam o tamanho minimo e tamanho maximo da area de heap da jvm.

A

Valeu, a dica foi matadora!! Gerou o relatório da tabela inteira. Só pra registrar, pra quem mais enxergar este tópico, tem uma pequena correção. Você mencionou o comando:

O certo é

Mas nada que fosse impossível descobrir… Mais uma vez, obrigado!!

Criado 1 de agosto de 2006
Ultima resposta 2 de ago. de 2006
Respostas 2
Participantes 2