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
- Se debe activar la property o3.jdbc.mysql.rowbyrow=true en el archivo O3Builder.properties u O3Designer.properties
APLICACION DE PARAMETROS EN LA CONEXION
Ante análisis y búsquedas en internet, un usuario de Genexus nos presenta una solución de aplicar tres parámetros a la conexión con el jdbc.
Esta solución es aplicable a todas las version de O3BI, ya que se debe ingresar al final de la URL tres parámetros indicando a nuestra conveniencia la cantidad de registros para indicar el Fetch Size.
?defaultFetchSize=150&useCursorFetch=true&jdbcCompliantTruncation=false
Nuestra experiencia nos indica que se puede indicar un valor de 5000.
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&jdbcCompliantTruncation=false