HowTo Crear Conexiones a MySQL sin que cargue todos los datos a memoria

Al ejecutar una consulta con el driver jdbc de MySQL el comportamiento normal es que devuelve la información luego de terminada la consulta a la BD.

En el caso de extraer una gran cantidad de información se podrá llegar al límite de la memoria virtual asignada al proceso y devolvernos un Java Heap Memory.

La solución a este inconveniente es solicitarle al driver que no cargue los datos en memoria y los devuelva.

Al día de la fecha de este documento hay dos soluciones

ROW BY ROW

Esta solución presentada en la propia documentación del driver de mysql, está en devolvernos los datos de a uno (row by row) y aplicable para la versión de O3 BI 5.4.022 , para versiones posteriores ver más adelante.

Debe considerarse que esta solución nos permitirá extraer la información deseada, y bajará notablemente la performance de extracción y por lo tanto aumenta los tiempos de construcción de cubo.

Procedimiento para versión 5.4.022

  • Se debe copiar el _o3p-HD-4582.jar a la carpeta classes de la instalación.

  • Adicionalmente se debe activar la property o3.jdbc.mysql.rowbyrow=true en el archivo O3Builder.properties u O3Designer.properties, segun corresponda.



Notificación

Se debe visualizar el siguiente mensaje en el log del componente actuante

MySQL Statement created to read row-by-row

Referencias: http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html

Procedimiento para versiones superiores a la 5.4.022

  • No requiere instalar el parche

  • Se debe activar la property o3.jdbc.mysql.rowbyrow=true en el archivo O3Builder.properties u O3Designer.properties

2. CONFIGURACION DEL FETCH SIZE EN LA CONEXION

Esta solución es aplicable a todas las version de O3BI, ya que se debe ingresar al final de la URL 2 parámetros indicando a nuestra conveniencia la cantidad de registros para el Fetch Size.

defaultFetchSize="ValorDeFetchSize"

useCursorFetch=true

Si bien en teoría cuanto mayor es el valor de FetchSize mas rápido se resuelve la consulta y mayor es el consumo de memoria, nuestra experiencia indica que se puede setear un valor de 5000 de Fetch Size sin inconvenientes de consumo de memoria y mejores tiempos.

Por lo tanto la definición de una conexión en el O3Designer en la url quedará como:

//SERVIDOR:PUERTO/BASE?defaultFetchSize=5000&useCursorFetch=true