So synchronisieren Sie eine von PL / SQL aufgerufene Java-Methode

Ich habe nur ein Problem in Bezug auf die Parallelität, deren logischer Ablauf darin besteht, dass ein Client (Oracle Forms genannt) eine Anforderung (Concurrent Program genannt) sendet und eine plsql-Prozedur aufruft. Diese Prozedur ruft schließlich eine statische Java-Methode auf.

Was ich finde, ist, dass, wenn ich zwei Anfragen gleichzeitig oder in einem sehr kurzen Intervall (wie 1 Sekunde) einreiche, ein Nebenläufigkeitsproblem festgestellt wird.

Die Java-Methode ist der Ausgangspunkt für eine Suche in der Datenbank, die angibt, welche Datensätze in die Datenbank eingefügt werden sollen.

Das Problem ist, dass sie zu einem doppelten Ergebnis führen, da es bei beiden Anfragen in Ordnung ist, neue Datensätze einzufügen.

Ich habe versucht hinzuzufügensynchronized in der statischen Java-Methode, aber das löst dieses Problem nicht, warum?

Was ich mache ist:

public static synchronized void execute

Bitte beachten Sie, dass die Einfügung in plsql aufgerufen wird, was bedeutet, dass ich nicht genügend synchronisiere, wenn ich nur die Java-Methode synchronisiere. Aber wenn ich in das Protokoll schaue, werden die beiden Anforderungen in derselben Sekunde ausgeführt, was ich nicht für normal halte! da Datenbank abfragen und der Vorschlag ist zeitaufwändig.

Um die Java-Methode wirklich zeitaufwändig zu machen, füge ich einen Code-Aufruf hinzuThread.sleep(5000), und für die Zeit nach diesem Code protokollieren und die Thread-ID protokollieren.

Überraschung zu sehen, dass dieThread ID ist 1! Und auch die Zeit, in der sie schlafen gehen, ist in der gleichen Zeit. Warum ist das so?

Was kann ich tun, um das Problem zu lösen? Irgendeine Sperre für die Java-Methode oder pl sql?

PS: Ich versuche jetzt zu benutzenDMBS_LOCK, und das scheint zu funktionieren, aber ich hoffe immer noch zu wissen, warum die Java-Methode nicht synchronisiert ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage