Uff que raro, no son para nada una cantidad millonaria de registros, yo he tenido que realizar actualizaciones de más de medio millón de registros uno por uno porque cada uno tenía sus peculiaridades y te puedo asegurar que el rendimiento de JPA es bastante aceptable, realizando miles de operaciones sobre BBDD en segundos, no entiendo como un simple merge puede dar estos problemas, pero al turrón!!!
¿ Porque elegiste manejar tu mismo las transacciones ? Veo que tienes un WebParam y JSON, entiendo que será un WebService que modifica un cliente, por lo que tendrás un servidor de aplicaciones y un contenedor que gustosamente gestionará las transacciones por ti, evitandote begins,commits ... y toda esas cositas que tienes por ahí, bueno concretamente me refería a tu RESOURCE_LOCAL. También deberías configurar obviamente el JNDI en el servidor de aplicaciones.
Es difícil medir el rendimiento de una transacción cuando...no se sabe nada acerca de las tablas que gestionas, los tipos de datos, indices... etc Si puedes añadir algo de información al respecto...lo agradecería.
No veo en tu persistence.xml nada referente a :
Código Java:
Ver original<property name = "hibernate.show_sql" value = "true" />
Si tienes problemas con las sentencias que ejecutas contra BBDD, sería bueno poder ver las consultas/updates que realiza JPA contra la BBDD, al menos durante la fase de desarrollo, y así podrás lanzar esas consultas en el cliente y ver cuanto tardan realmente. Recordar que cuando JPA realiza un merge, lo primero que realiza es una consulta contra tu BBDD
y también podría ser que tu Entity Cliente tuviera relaciones con otras tablas y JPA con la consulta previa al update te las estuviera recogiendo también.
Resumiendo, revisa el tema de quien gestiona las transacciones, es mejor que dejárselo al contenedor, y aunque le des el control, puedes modificar la transaccionalidad en determinadas operaciones o hacer que incluso algunas operaciones no sean transaccionales (ganas muchísimo tiempo), sobre todo operativas que requieran únicamente lectura contra BBDD, o no te importe que tu BBDD pueda ser inconsistente jeje.
Con el
show_sql, podrás ver que sentencias se están ejecutando contra BBDD, recógelas y lánzalas desde un cliente contra la BBDD, y verás si el problema lo tienes con el merge().
Si la consulta que realiza JPA para hacer el merge es lenta, y por lo tanto queda confirmada tu teoría, realiza
EXPLAIN PLAN sobre tus sentencias para ver donde pierdes tiempo, tal vez la consulta no este optimizada, o no tengas indices, o yo que se, quien me dice a mi, que tu PK no es un String ejejej.
Ya siento no poder decirte más, con las tablas, la consulta + update de JPA y teniendo algunos tiempos(Desglosa JSON y el merge y evalua cuanto tarda cada uno) podría darte más información.
Saludos!!!!!