Inserción masiva mediante JPA

Persist Cascade: Análisis

La inserción en cascada mediante el método persist de JPA, se traduce en una conversación entre el servidor de aplicaciones y la base de datos, la conversación se inicia en el momento en que se realiza el commit a la base de datos, si se usa un EJB y JTA este commit se invoca al finalizar el  servicio del EJB.

La conversación es bidireccional es decir se envían una serie de paquetes de ida y venida entre el servidor de aplicaciones y la base de datos, lo cual nos permite verificar que un persist en cascada mantiene el enfoque de realizar varias solicitudes a la base de datos y esta a su vez responder al servidor de aplicaciones, eliminando la idea de que se envían un paquete único que contiene todos las sentencias sql que permiten insertar registros en la base de datos.

Un paquete contiene el query correspondiente que permite la ejecución de un procedimiento almacenado temporal creado por el driver JDBC, este sp recibe como parámetro de entrada una cadena que contiene la sentencia sql “insert into…..” que insertara finalmente el registro en la tabla, esta petición es encapsulada  en un paquete TDS  que se envía a través del puerto 51103, una vez que la base de datos procesa el sp esta retorna la respuesta al servidor de aplicaciones mediante un paquete TDS de respuesta, esta respuesta contiene los valores de salida del sp temporal.

El ambiente involucra los siguiente componentes:

  • Servidor de aplicaciones GlassFish 3.1.2
  • Sybase ASE server 15
  • JPA
  • EJB
  • JTA
  • JConnet4 driver JDBC

El  resultado es una serie de mensajes TDS que resultan en una conversación entre la base de datos y el app server a través de una serie de paquetes TDS. Cada uno de los paquetes TDS contiene contiene una  llamada al sp temporal que inserta el registro en  la bdd .

Los resultados globales son los siguientes al insertar 10000 registros

#Paquetes Tiempo Avg paquete/segundo Avg paquete(bytes) Conversación Completa(bytes) GlassFish – > Sybase (bytes) Sybase -> GlassFish (bytes)

76001

312,909

242,885

328,176

10300110

7339123

2960987

Conclusiones

La sesión está asociada a una conexión proveído por el pool de conexiones, por lo que una sesión abierta lleva un registro de lo que ha leído y de lo que ha insertado, hasta que se cierra, en un contexto en el cual se persisten uno a uno las entidades conforme se van insertando más objetos, la sesión tiene más información en memoria. Es importante anotar que el Garbage Collector no limpia la memoria puesto que la sesión sigue haciendo referencia a ellos hasta que finalice el método del EJB o hasta que se haga un flush y un clear mediante el entity manager, y conforme se insertan más datos el uso de memoria aumente considerablemente.

Hibernate y JPA generalmente no son la mejor opción para manejar grandes volúmenes de datos, ni en consultas ni inserciones. Son adecuados y han sido probados  para traer algunos datos de una base SQL y manipularlos como objetos, lo cual facilita notablemente el trabajo del desarrollador, también son óptimos para transacciones muy puntuales. Sin embargo para   insertar lotes de miles de datos  la opción más adecuada parece ser JDBC.

El  API de JPA no proporciona las opciones para hacer óptimo el proceso de guardar masivamente registros, en su defecto el  ORM de Hibernate usa el API JDBC batch a través de la propiedad hibernate.jdbc.batch_size, para obtener más información de esta opción  consulte el siguiente link : http://www.javabeat.net/2008/07/batch-insert-in-hibernate/

saludos desde Ecuador

About these ads

Dejanos tus observaciones o comentarios

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s