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