J'utilise hibernate dans un auditeur de printemps Lorsque je laisse l'auditeur exécuter avec plusieurs threads, je rencontre souvent ce L'exception est lancée à Q.List (): P> Échec de verrouillage optimiste; Exception imbriquée est
org.hibernate.staleObjectStateException: la ligne a été mise à jour ou supprimée par
Une autre transaction (ou la cartographie de valeur non enregistrée était incorrecte) p>
BlockQuote> defaultMessagelisenContainer code>.
StalcestateException code> pour une opération en lecture seule: p>
for (String n : keywordNames) {
Keyword k = keywordDao.getKeywordByName(n);
}
3 Réponses :
Le StalestateException code> se produit lorsque nous essayons d'accéder à une ligne qui n'existe pas. Vérifiez votre mot-clé
key.getname () code> pour voir ce qu'il revient. p>
C'est vrai, StalestateException se produit i> quand (d'API DOC) "Nous essayons de supprimer ou de mettre à jour une ligne qui n'existe pas" mais la question était sur la question de StaleObitStateException, pas de StalestateException. Ils sont liés, cependant. Tout d'abord, StalestateException est lancée, alors si une entité "Verseed" est mise à jour, elle se fait capturer, puis StataleObjectStateException est finalement lancée. Donc, votre déclaration est correcte, mais, strictement parlant, sans rapport avec la question initiale.
Certaines autres transactions pourraient mettre à jour l'entité de mots clés en même temps que vous lisez et votre opération de lecture pourrait entraîner des objets rassis. P>
Ceci est un verrouillage optimiste. Vous pouvez envisager un verrouillage pessismique, mais cela affectera sérieusement la performance. P>
Je suggérerais d'attraper StataleObjectStateException code> et essayez de lire à nouveau. P>
Je ne suis pas op, mais de ma compréhension, une vérification de la concurrence optimiste se produit lorsque vous faites réellement une mise à jour et lorsque vous rincer à DB. Il suffit de demander une vérification de la concurrence optimiste.
@Sublin: Merci pour votre réponse. Je n'ai pas de problème pour réessayer l'opération, mais je veux savoir pourquoi une lecture de lecture. peut renvoyer un stalleObject. Je ne partage pas l'objet de session entre le thread, de sorte que l'opération de lecture doit lire l'objet de DB, qui ne doit pas conduire à un objet d'objet hors date? Je vais mettre à jour ma réponse avec le code d'accès aux données
L'objet obsolète n'est pas causé par la lecture directe. Veuillez vous référer à ma réponse pour savoir pourquoi une lecture peut indirectement une vérification optimiste de la concurrence
Je crois que d'autres réponses données ne sont pas correctes. L'accès à la ligne n'existe pas ne donne pas StataleObjectStateException et il suffit d'interroger une entité ne va pas déclencher une serrure optimiste pour cette entité aussi. P>
Une inspection supplémentaire sur la trace de la pile donnera quelques indications pour la cause: p>
Vérifiez quelle est la cause de l'échec de la concurrence optimiste. Normalement, nous reproduisons simplement l'exception simultanée optimiste à l'appelant et laissez appeler décider si elles souhaitent invoquer à nouveau la fonction. Cependant, tout dépend de votre conception. P> à org.hibernate.impl.queryimpl.list (QueryImpl.java:102) CODE> Quand vous appelez QUERY.LIST () P>
à org.hibernate.impl.sessionimpl.autoflushififrequikequirequitéd (sessionImpl.java:1175) code> Hibernate déterminera si l'affleurement automatique de la session est requis. Par une raison quelconque, hibernate croit que la chasse d'automobile est requise. (Probablement du fait que vous avez déjà effectué une mise à jour sur une entité de mots clés dans la même session ou d'autres entités ... c'est quelque chose que je ne peux pas dire honnêtement) p>
à org.hibernate.persistister.entister.AbstractentityPersister.euvre (abstracttrentypersister.java:2805) code> alors hibernate affleurera toutes les modifications de la session à la DB. Et, le problème de StaleObjectStateException survient ici, ce qui signifie une défaillance optimiste de vérification de la concurrence. La défaillance de la vérification de la concurrence optimiste peut ou non être liée à une entité de mots clés (Coz, il s'agit simplement de toutes les entités mises à jour en session à la DB). Toutefois, dans votre cas, il est réellement lié à
Mot-clé Code> (
causé par: org.hibernate.staleObjectStateException: la ligne a été mise à jour ou supprimée par une autre transaction (ou la cartographie de valeur non enregistrée était incorrecte) : [com.ncs.singtel.aurora.common.model.keyword # 7550] code>) p>
Merci pour votre réponse. J'essaie d'identifier la cause de voir si je peux l'éviter. Actuellement, si je fais une nouvelle tentative, le temps d'exécution finit par durablement la même chose même si j'ai plus de threads en raison d'un grand nombre de tentatives.
J'ai essayé de décrocher la session.IsDirty () vérifié entre toutes les opérations de DB avant cette exception, Q.List (). Mais de manière intéressante, aucune des opérations précédentes ne causer de sale session (elles sont toutes lues).
Je vous suggérerai d'utiliser jdbcdslog code> et de jeter la relève actuelle de la mise à jour et des variables contraignées. Cela peut vous donner des indices sur quelle entité causent le problème.
J'ai marqué votre question comme correct. Cela m'a signalé de comprendre cette requête.List () Résultat d'une flush Auto par hibernate avant l'instruction SELECT. J'ai pensé que Flush () par défaut est en mode manuel.
Eh bien, c'est en effet manuel mais hibernate dans certains cas fera une affleurance :). Je pense que cela dépend de la classe d'entité que vous recherchez et de la session
@Adrianshum, StataleObjectXception n'existe pas dans Hibernate. StalcestateException et StataleObjectStateStateException font, ils sont liés (voir ci-dessous) et la différence est importante. Autre que ça, bonne réponse.
Pouvez-vous mettre le code d'accès complet de données? Votre session est-elle partagée sur les threads?
Avez-vous un
@postread code> dans
mot-clé code> pour mettre à jour le contenu de l'entité ou y at-il une logique spéciale dans DAO qui mettra à jour le mot-clé
> Entité après avoir récupéré?
Yup, mon mauvais. Il y a une partie pour mettre à jour le mot-clé. J'ai marqué votre question comme correct. Je suis capable de refactoriser le code et de supprimer la mise à jour inutile, réduisez ainsi l'exception StataleObject.