Posteado por: jotas | Diciembre 16, 2007

Virtualizar informes con JasperReports

Uno de los problemas con los que, si trabajamos con JasperReports, acabamos encontrándonos inevitabemente es el de falta de memoria para ejecutar un informe mediano-grande. Básicamente nos puede ocurrir que al lanzar un informe nos salte un error de java java.lang.OutOfMemoryError, porque en el proceso de FILL (Obtener los datos y rellenar la plantilla del informe con estos) nos hemos quedado sin memoria heap.

memoria

En un pprincipio se nos puede ocurrir aumentar esta memoria, cambiando las propiedades de la máquina virtual para que en lugar de abrir con 64 megas abra con, que se yo, 512 megas. Pues bien, es evidente que esa no es la solución, y a poco que googleemos nos encontramos con este artículo en el que nos enseñan a generar informes grandes, abordando el problema de dos maneras: La paginación y la virtualización.

Paginación se refiere a obtener el informe en trozos, en lugar de recoger toda la información de golpe, pero como al final los datos se tienen que mostrar juntos en un único informe, nos introducen la virtualización. La virtualización es una técnica que consiste en serializar los datos, para no saturar la memoria heap.

El código necesario para incluir virtualización, ojo, a costa de perder rendimiento, es el siguiente:

String temporalPath = System.getProperty("user.home") + File.separator + "tmp";
 //creando el directorio temporal
File temporalDir = new File(temporalPath);
if (!temporalDir.exists() || !temporalDir.isDirectory()) {
    temporalDir.mkdir();
}
// crear el virtualizador
JRFileVirtualizer virtualizer = new JRFileVirtualizer(10, temporalDir); Map params = dlg.getReportParameters();
params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

En las primeras cuatro líneas creamos el directorio en el que vamos a almacenar temporalmente los datos. Obtenemos en el ejemplo una referencia a “user.home” que en windows será documents and settings/NOMBRE_USUSARIO, en linux /home/NOMBRE_USUARIO y en otros sistemas vaya usted a saber. A esa ruta le concatenamos /tmp y nos aseguramos de que exista.

Una vez que tenemos el directorio en el que queremos que se metan los datos creamos un virtualizador de fichero JRFileVirtualizer pasándole como parámetro 10 (Indica que generará archivos de 10 ks) y el directorio que hemos creado.

Finalmente añadimos el parámetro con key: JRParameter.REPORT_VIRTUALIZER y value: nuestro objeto virtualizador a los parámetros que le pasaremos al jasper para generar el informe. Si recordamos JasperFillManager.fillreport(jasperreport, parametros).

Únicamente tenemos que acordarnos de que esos archivos temporales ocupan espacio. Podríamos borrarlos usando

temporalDir.delete();

Con esto seguro que no se nos resiste ningún informe, por grande que sea. (Dudas y sugerencias donde siempre…)


Respuestas

  1. Muy interesante y util información. Jasper siempre me ha sorprendido por su aparente sencillez pero amplia capacidad de resolución.

  2. [...] Foto: Tirando Líneas [...]


Dejar una respuesta

Su respuesta:

Categorías