entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Error de memoria / Java

Buen día compañeros.

Tengo un JSP que corre un stored procedure el cual me trae cerca de 150,000 registros los cuales se imprimen en una tabla y se exportan a .xls.

Cuando ejecuto el jsp me manda este error.

java.lang.OutOfMemoryError: Java heap space
com.mysql.jdbc.Buffer.getBytes(Buffer.java:198)
com.mysql.jdbc.Buffer.readLenByteArray(Buffer.java:318)
com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1360)
com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2326)
com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:436)
com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2033)
com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1436)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1770)
com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
com.mysql.jdbc.Connection.execSQL(Connection.java:3178)

no se si tenga que ver que son demasiados registros y sinceramente no tengo idea de como arreglarlo

2 Respuestas

1voto

Leonardo-Tadei Puntos227320

Hola Alejandro,

el error indica que no hay memoria suficiente para ejecutar el proceso.

Por lo que parece, estás leyendo los 150 mil registros, los estás guardando y tal vez formateando en un vector o similiar (la tabla posiblemente) para luego mostrarlos en la tabla y exportarlos.

La solución simple pero menos aplicable es decirle al entorno que la aplicación pueda consumir más RAM para que todo entre. Sin embargo si los datos aumentan esto puede volver a pasar en el futuro.

La solución para siempre es ejecutar la query varias veces paginando (por ejemplo de a 5 o de a 10 mil registros) de manera tal de no desbordar las esctructuras que estás usando. Esto implica posiblemente que también tengas que usar la misma estrategia en el exportador.

La cuestión es que no podés tener en RAM 150 mil registros a la vez para procesarlos!

Saludos

PD: me encontré con una solución que consiste en achicar el buffer de lectura del JDBC, pero no la he probado nunca. Te dejo el enlace por si es aplicable a tu código: http://benjchristensen.com/2008/05/27/mysql-jdbc-memory-usage-on-large-resultset/

1voto

xabe Puntos2180

Hola

Como bien dice @Leonardo-Tadei el error es por falta de memoria, pero la solución no es poner más memoria a la máquina virtual de java. Porque es inviable tener 150 mil registro en memoria y más siendo una aplicación web. Lo que tienes que hacer es paginar el resultado. Aquí te dejo un enlace como hacer Sql's dependiendo el tipo de base de datos que uses Paginación Nativa.

Saludos

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta