Question

J'utilise JPA soutenu par Hibernate comme couche de persistance. J'ai un processus multithread qui regroupe les données d'un appel Soap puis stocke une ligne dans une base de données. Le processus finit généralement par insérer environ 700 lignes et prend environ 1 à 3 heures, les appels de Soap étant le principal goulot d'étranglement.

Pendant tout ce processus, le tableau que je suis en train d'insérer se verrouille et ne renvoie pas les déclarations sélectionnées à temps.

Voici l'erreur de serveur SQL:

  

Message d'erreur: le délai d'attente de la demande de verrouillage est dépassé.

Comment éviter de verrouiller ma table de base de données au cours de ce long processus?

Était-ce utile?

La solution

Insérez-vous les 700 lignes avec la même transaction?

Où se trouve votre frontière de transaction? Si vous pouviez peut-être réduire votre limite de transaction, c’est-à-dire uniquement l’opération d’insertion réelle, le verrou est donc verrouillé.

Si vous souhaitez que l'ensemble du processus soit atomique, il peut être intéressant de l'écrire dans une table temporaire, puis d'effectuer une insertion en bloc (rapide) pour l'insérer dans la table principale.

Autres conseils

Vous devez probablement modifier votre niveau d'isolement.

Voici quelques informations: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

Il parle des différents niveaux d’isolement et de ce qu’ils peuvent éviter. La méthode générale consiste à commencer par le strict, puis à baisser si vous avez besoin de meilleurs temps de réponse, tout en gardant à l'esprit les exigences en matière d'intégrité des données / de lectures erronées.

modifier

Les niveaux de transaction Spring sont utilisés pour résumer les niveaux d'isolation de transaction JDBC (ou autre) au niveau du gestionnaire de transaction. Ils sont définis dans la TransactionDefinition classe et sont des membres statiques.

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.

Il existe également des niveaux de propagation de transaction. Vous utilisez peut-être une transaction pour des lectures pures, ce qui peut être excessif - les lectures ne requièrent pas de transactions, les écritures doivent TOUJOURS être entourées d'une transaction. Les niveaux de propagation sont également définis dans TransactionDefinition. Celles-ci sont utilisées, généralement dans un fichier de câblage de ressort, pour définir la sérialisation et la propagation d'un appel particulier. Si vous avez un exemple de votre câblage, je pourrais peut-être donner plus d'indications / informations.

Essayez-vous de faire 700 demandes de savon en une seule transaction JPA? Ne fais pas ça. : -)

scroll top