2009-07-30 6 views
5

J'utilise JPA soutenu par Hibernate comme couche de persistance. J'ai un processus multi-thread qui agrège 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 savon étant le principal goulot d'étranglement.Comment empêcher les insertions JPA de verrouiller une table de base de données?

Pendant tout ce processus, la table que j'insère dans les verrous et ne retournera pas les instructions select en temps opportun.

Voici l'erreur du serveur SQL:

Error Message: Lock request time out period exceeded.

Comment puis-je éviter de bloquer ma table de base de données au cours de ce long processus?

Répondre

1

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

Où se trouve votre limite de transaction? Si vous pouvez peut-être abaisser votre limite de transaction, c'est-à-dire que seule l'opération d'insertion réelle est traitée, de sorte que le verrou est maintenu. Si vous voulez que tout le processus soit atomique, il peut être utile de l'écrire dans une table temporaire, puis de l'insérer en bloc (rapide) pour l'insérer dans la table principale.

+0

Je ne suis pas sûr de mes limites de transaction. J'ai @transactional sur mes méthodes DAO qui ont besoin d'une transaction, mais j'ai aussi @transactional sur mon point d'entrée au code en utilisant le DAO. Si je supprime l'ancien, il me donne une erreur sans transaction. C'est quelque chose que j'étudie actuellement. Check out http://stackoverflow.com/questions/807457/ –

+0

Mon @Transactional était trop loin, une fois que je l'ai retiré, le processus fonctionne correctement sans verrouiller la base de données. J'ai encore quelques problèmes étranges @Transactional, mais pour ce processus, je l'ai résolu juste en comptant sur de plus petites transactions. Cette question a été utile aussi http://stackoverflow.com/questions/1079114 –

2

Vous devez probablement modifier votre niveau d'isolation.

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

Il parle sur les différents niveaux d'isolement, et ce qu'ils peuvent aider à se prémunir contre. La manière générale de faire ceci est de commencer avec le strict, puis d'aller plus bas si vous avez besoin de meilleurs temps de réponse, tout en gardant à l'esprit les exigences d'intégrité des données/fausses lectures.

modifier

niveaux de transaction de printemps sont utilisés pour JDBC abstrait (ou autre) les niveaux d'isolation des transactions au gestionnaire de transactions. Ils sont définis dans la classe TransactionDefinition 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. Il se peut que vous utilisiez une transaction pour des lectures pures, ce qui pourrait être excessif - les lectures ne nécessitent pas de transactions, les écritures doivent TOUJOURS avoir une transaction autour d'elles. Les niveaux de propagation sont également définis dans TransactionDefinition. Ceux-ci sont utilisés, généralement dans un fichier de câblage à ressort, pour définir la sérialisation et la propagation pour un appel particulier. Si vous avez un exemple de votre câblage, je pourrais être en mesure de donner quelques conseils/informations supplémentaires.

+0

Et si vous utilisez un gestionnaire de transactions Spring, lorsque vous configurez la transaction DAO, vous pouvez définir les niveaux d'isolation pour chaque appel transactionnel. – aperkins

+0

Vraiment, pouvez-vous développer cela ou me diriger dans la direction d'un article qui se développe là-dessus? –

+0

Notez que toutes les informations de printemps que je reçois du livre de référence "Pro Spring" par Rob Harrop et Jan Machacek. Bien que ce soit un livre très sec, c'est un bon article de référence pour le printemps avec un très bon index. C'est le livre qui a finalement fait des transactions "clic" pour moi - bien que cela ait pris du temps :) – aperkins

0

Etes-vous en train d'effectuer 700 demandes de savon dans une transaction JPA? Ne fais pas ça. :-)

+0

Non, ce que le programme fait c'est faire un appel SOAP obtenir les résultats, puis rapporter dans la base de données.Les transactions sont gérées par Spring. –