2009-07-30 23 views
5

Estoy usando HPA 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 - 3 horas, siendo las llamadas Soap el principal cuello de botella.¿Cómo evito que las inserciones JPA bloqueen una tabla de base de datos?

Durante todo este proceso, la tabla en la que estoy insertando se bloquea y no devolverá las declaraciones seleccionadas de manera oportuna.

Aquí está el error del servidor SQL:

Error Message: Lock request time out period exceeded.

¿Cómo evitar el bloqueo de mi mesa base de datos durante este largo proceso?

Respuesta

1

¿Inserta todas las 700 filas con la misma transacción ?

¿Dónde está su límite de transacción? Si pudiera reducir el límite de su transacción, es decir, solo transacción, la operación de inserción real, por lo que el bloqueo se mantendrá brevemente.

Si necesita que todo el proceso sea atómico, podría ser una idea escribirlo en una tabla temporal y luego hacer una inserción masiva (rápida) para insertarlo en la tabla principal.

+0

No estoy seguro de mis límites de transacción. Tengo @transactional en mis métodos DAO que necesitan una transacción, pero también tengo @transactional en mi punto de entrada al código que usa DAO. Si elimino el anterior, me da un error de no transacción. Es algo que estoy investigando actualmente. Visite http://stackoverflow.com/questions/807457/ –

+0

Mi @Transactional estaba muy lejos, una vez que lo eliminé, el proceso funciona bien sin bloquear la base de datos. Todavía tengo algunos problemas extraños @Transactional, pero para este proceso lo resolví simplemente confiando en transacciones más pequeñas. Esta pregunta también fue útil http://stackoverflow.com/questions/1079114. –

2

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 de los diferentes niveles de aislamiento, y lo que puede ayudar a proteger contra. La forma general de hacerlo es comenzar con el terminista y luego ir más bajo si necesita mejores tiempos de respuesta, teniendo en cuenta los requisitos de integridad de datos/lecturas falsas. los niveles de transacción

edición

primavera se utilizan para JDBC resumen (o lo que sea) niveles de aislamiento de transacción en el administrador de transacciones. Se definen en la clase TransactionDefinition 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. Puede estar utilizando una transacción para lecturas puras, que pueden ser excesivas: las lecturas no requieren transacciones, las escrituras SIEMPRE deben tener una transacción a su alrededor. Los niveles de propagación son definitivos en TransactionDefinition también. Estos se utilizan, generalmente en un archivo de cableado de primavera, para definir la serialización y la propagación de una llamada en particular. Si tiene un ejemplo de su cableado, podría darle más pistas/información.

+0

Y si está utilizando un administrador de transacciones de Spring, cuando configura la transacción DAO, puede establecer los niveles de aislamiento para cada llamada transaccional. – aperkins

+0

Realmente, ¿puedes ampliar eso o dirigirme en la dirección de un artículo que se expanda sobre eso? –

+0

Tenga en cuenta que toda la información de Spring que obtengo del libro de referencia "Pro Spring" de Rob Harrop y Jan Machacek. Si bien es un libro muy seco, es una buena referencia para Spring con un índice realmente bueno. Fue el libro el que finalmente hizo que las transacciones hicieran clic para mí, aunque tardó un tiempo :) – aperkins

0

¿Está tratando de hacer 700 solicitudes de jabón en una transacción JPA? No hagas eso. :-)

+0

No, lo que el programa hace es hacer una llamada SOAP para obtener los resultados, luego informar en la base de datos.Las transacciones son manejadas por Spring. –

Cuestiones relacionadas