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?

¿Fue útil?

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. :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top