JPA – Improve performance

En estos días tuve una tarea relativamente sencilla que en resumen consistía pasar los datos de una tabla hacia otra, previo algunos procesos de transformación y cambio (esto lo hice invocando código dinámicamente, luego se los comento); así ya se pueden dar una idea de lo que debía hacer, lo que debo destacar aquí es el volumen de datos ya tenía 1450000 filas aproximadamente.

Lo que utilicé para la tarea fue JDK1.8, JPA como base de datos MySQL. Como se pueden imaginar la tarea es bastante sencilla un par de entidades JPA que representan las tablas origen y destino, y lo único que queda es ejecutar las transformaciones. El verdadero problema llegó cuando traté de ejecutar el proceso sobre todo el conjunto de datos. Llegué a procesar 100000 registros en 230 minutos, ese resultado era intolerable.

La tarea se convirtió en mejorar el desempeño de JPA, luego de buscar encontré está página este blog  Java Persistence Performance – How to improve JPA performance by 1,825% y traté de implementar algunas de las recomendaciones que ahí se hacen. En resumen implementé las siguientes (la paginación ya la tenía):

  1. Batch writing, optimización número 8. Agregué las siguientes líneas a mi persistence.xml:
    <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
    <property name="eclipselink.jdbc.batch-writing.size" value="1000" />
  2. Implementé también la optimización 11, agregando las siguientes líneas al mismo archivo
    <property name="eclipselink.persistence-context.flush-mode" value="commit"/>
    <property name="eclipselink.persistence-context.close-on-commit" value="true"/>
    <property name="eclipselink.persistence-context.persist-on-commit" value="false"/>

    No me quise eliminar los mensajes de log.

  3. Finalmente agregué un parámetro al url de mi conexión, quedando así
    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://<myserver>:<myport>/<mydatabase>?rewriteBatchedStatements=true"/>

    Esto lo encontré en el mismo blog, pero la entrada Batch Writing, and Dynamic vs Parametrized SQL, how well does your database perform?

Con éstas configuraciones logré procesar el 1450000 registros en 19 minutos, no cambié nada en el código únicamente modifiqué el archivo de configuración de JPA.

Espero que éstas líneas les puedan ayudar a ustedes también.

Full Text Search en Java

En éstos días he estado buscando información sobre Full Text Search tanto a nivel de base de datos, especialmente MySQL y Oracle, y también a nivel de Java y me he encontrado con los siguientes links que comparto con ustedes, esperando como siempre sean de su utilidad.

Links:

Aunque en la UTPL, ya tenemos alguna experiencia con Oracle Text Search (Sistema de Biblioteca Zebra) estoy buscando alternativas que nos permitan crear un software para bibliotecas de bajo costo, pero de alto rendimiento, con principios semánticos y búsquedas en lenguaje natural. Y finalmente les dejo un link de un software que tiene parte de lo que estoy buscando (semántica y búsquedas en lenguaje natural) pero es para bibliotecas digitales y que me está dando ideas para mi doctorado.

Si quieren conocer algunas deficiencias de Lucene (así me enteré de la existencia de MG4J) revisen éste post

NetBeans 6.1 Beta disponible

La versión 6.1 de NetBeans se encuentra disponible para la descarga, pulse aquí para ir al sitio de descarga. Existe una gran cantidad de características que se explican aquí; características como:

  • Soporte para Spring
  • Nuevo Data Base Explorer para MySQL
  • Mejores en el desempeño (como 40% más rápido en el arranque)
  • Mejores en el soporte de JavaBeans
  • Generador CRUD en aplicaciones JSF
  • Mejores en el soporte para Ruby/JRuby
  • Y otras mas…

Las Release Notes puede encontrarse aquí y las instrucciones para la instalación aquí y visitando ésta página puede encontrar mayores detalles.