2017-04-18 6 views
0

Obwohl diese Frage scheint einfach, mein Szenario ist ganz anders als andere Posts @ Stackoverflow. Ich benutze Frühling mit JPA & Jersey (REST) ​​Implementierung. Immer, wenn ich getroffen 2 Anfragen gleichzeitig von curl meine Java REST-Methode, um Datenbankressourcen zu aktualisieren, wird erste Anforderung erfolgreich ausgeführt, aber zweite Anforderung wird mit optimistischer Sperre Ausnahme fehlgeschlagen:Wie Thread zu warten, bis ein anderer Thread die Methodenausführung abgeschlossen hat

javax.persistence.OptimisticLockException: Ausnahme [ EclipseLink-5006] (Eclipse Persistenzdienste - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.OptimisticLockException Ausnahme Beschreibung: Das Objekt kann nicht aktualisiert werden, da es seit dem letzten Lesen geändert oder gelöscht wurde .

Ich habe versucht, den aktualisierten Code in synchronisierten Block zu setzen, aber es hat nicht funktioniert.

Ich habe auch versucht zu erklären, dass Ruhe-Methode synchronisiert, aber nicht funktioniert.

Jetzt möchte ich, dass meine Methode von der ersten Anfrage ausgeführt wird und die zweite Anfrage warten soll, bis die erste Anfrage die Ausführung beendet.

Ich hatte dies mit static Variable erreicht, aber nicht static Variable aufgrund von Code-Standards verwenden möchten.

Kann jemand eine effiziente Lösung dafür geben?

+1

Ausführen der Datenbankoperationen zu verwenden, synchronisiert die gleiche Instanz. Geben Sie weitere Informationen darüber an, was Sie als Sperre verwendet haben und wie Sie sie verwendet haben. – erickson

+0

Was Ausdauer Ihnen sagt ist, dass Ihr zweites Update ein Rennen mit dem ersten Update hatte (was entsprechend Ihrer Frage zutrifft). Als Ergebnis wurde die zweite Aktualisierung unabhängig vom zweiten synchronisierten Block der internen Persistenz nicht angezeigt, und da die aktualisierte Entität für beide identisch ist, wird die zweite Aktualisierung zurückgewiesen, da ihre Daten "veraltet" waren. Was Sie idealerweise in diesem Fall tun sollten, ist eine veraltete Anforderung löschen und sie mit der aktualisierten Entität neu zu initiieren, und dann versuchen, sie erneut zu aktualisieren. –

+0

Haben Sie das '@ Version'-Feld innerhalb Ihrer zugeordneten Klasse mit der entsprechenden Tabellenspalte? – eg04lt3r

Antwort

0

Verwendung der Synchronisation vor dem DB-Aufruf wird helfen.

1) Synchronized Schlüsselwort

synchronized(this){ 
//process 
} 

2) andere Option ist vor Methodennamen innerhalb eines synchronisierten Block sollte funktionieren, solange Sie synchronisieren auf

synchronized void <method(){ 
//process 
} 
Verwandte Themen