¿Cómo evito que las inserciones JPA bloqueen una tabla de base de datos?
-
05-07-2019 - |
Pregunta
Estoy usando JPA respaldado por Hibernate como mi capa de persistencia. Tengo un proceso multiproceso que agrega datos de una llamada de Soap y luego almacena una fila en una base de datos. El proceso generalmente termina insertando alrededor de 700 filas y toma alrededor de 1 a 3 horas, con las llamadas de jabón como el cuello de botella principal.
Durante todo este proceso, la tabla que estoy insertando se bloquea y no devolverá las declaraciones de selección de manera oportuna.
Aquí está el error del servidor SQL:
Mensaje de error: Se excedió el tiempo de espera de solicitud de bloqueo.
¿Cómo evito bloquear mi tabla de base de datos durante este largo proceso?
Solución
¿Inserta las 700 filas con la misma transacción?
¿Dónde está el límite de su transacción? Si tal vez pudiera reducir el día de la transacción, es decir, solo realice la operación de inserción real para que el bloqueo se mantenga brevemente.
Si necesita que todo el proceso sea atómico, puede ser una idea escribirlo en una tabla temporal y luego hacer una inserción masiva (rápida) para insertarlo en la tabla principal.
Otros consejos
Probablemente necesite cambiar su nivel de aislamiento.
Aquí hay alguna información: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels
Habla sobre los diferentes niveles de aislamiento y contra qué pueden ayudar a protegerse. La forma general de hacerlo es comenzar con el estricto y luego bajar si necesita mejores tiempos de respuesta, teniendo en cuenta los requisitos de integridad de datos / lecturas falsas.
edit
Los niveles de Spring Spring se usan para abstraer los niveles de aislamiento de transacciones JDBC (o lo que sea) en el administrador de transacciones. Se definen en TransactionDefinition clase, y son miembros estáticos.
TransactionDefinition.ISOLATION_DEFAULT
Default isolation
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions
TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data
TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads
TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.
También hay niveles de propagación de transacciones. Es posible que esté utilizando una transacción para lecturas puras, lo que puede ser excesivo: las lecturas no requieren transacciones, las escrituras SIEMPRE deben tener una transacción a su alrededor. Los niveles de propagación también están definidos en TransactionDefinition. Estos se utilizan, generalmente en un archivo de cableado de resorte, para definir la serialización y la propagación de una llamada en particular. Si tiene un ejemplo de su conexión, podría darle algunas sugerencias / información más.
¿Está tratando de hacer 700 solicitudes de jabón en una transacción JPA? No hagas eso. :-)