In meiner Anwendung verwende ich 20 Threads für einen Job. Jeder Thread ruft einen Remote-Webdienst auf und aktualisiert die Oracle-Datenbank. Nach dem Neustart von Jboss schlägt der Job beim Aktualisieren der Datenbank fehl, mit der Ausnahme, dass ich im Protokoll Folgendes finde:
%Vor%Vom Thread für db-Operationen verwendeter Code:
%Vor%Asyn Methode Aufruf updateStudentAddress Methode
%Vor%Ich verwende den Container-verwalteten Entity-Manager für die DB-Übertragung.
Jeder Thread ruft die updateStudentAddress-Methode auf und aktualisiert 100 Datensätze.
Da dieser Job sehr lange läuft, kann jboss nach einiger Zeit keine weiteren Verbindungen mit Oracle herstellen.
Gibt es eine Möglichkeit, dieses Problem zu beheben?
Ich denke, dass das Problem durch die Ausnahmebehandlung innerhalb verursacht werden kann: asyncAddressDetails
Dieser Fehler trat in jboss7 auf, nachdem RuntimeException oder ApplicationException zum Rollback einer Transaktion geführt hatten, als diese Ausnahme abgefangen wurde und der Anwendungscode später weitere Operationen auf dem EntityManager vor dem Abschluss des aktuellen Transaktionskontextes ausführte.
Beispiel:
%Vor%secondCallInRequiredTransaction kann zu dem Fehler führen, wenn eine RuntimeException ignoriert wurde.
Wie das zu beheben ist, sehe ich die folgenden Möglichkeiten:
org.hibernate.exception.GenericJDBCException: Verbindung konnte nicht geöffnet werden. Könntest du Code zeigen? Es könnte Probleme mit Synchronisierungsthreads geben. oder schlechte Implementierung.
Sie brauchen eine offene Transaktion, wenn Sie versuchen, gegen die DB zu schreiben. ein Beispiel
%Vor%Wie eine andere Antwort darauf hinweist, können Sie Persistenz-Ausnahmen mit Hibernate niemals fangen und ignorieren, in den Dokumenten ist dies ausdrücklich verboten. Ich denke jedoch, dass dein Problem mit dem nächtlichen Neustart zusammenhängt. Es ist schwer zu sagen, ohne die vollständigen Protokolle, aber wenn JBoss startet, beginnen einige Teile vor den anderen. Es ist üblich, eingehende Anfragen zu erhalten, bevor alles initialisiert wird und dann Fehler auftreten. Wenn Sie die Neustarts einer Nacht verhindern können, können Sie sehen, ob Sie immer noch den Fehler erhalten.
Das Update (außer dem Neustart) soll sicherstellen, dass die Komponenten in der richtigen Reihenfolge starten oder eingehende Anrufe verhindern (einfach, wenn sie einen Load Balancer durchlaufen), bis der Neustart abgeschlossen ist.
Um die Startreihenfolge zu steuern, bearbeiten Sie application.xml
und stellen Sie sicher, dass initialize-in-order
wahr ist. Listen Sie dann die Module in der gewünschten Startreihenfolge auf. Die Web- / Job-Ebene sollte zuletzt starten.
Eine sehr schmutzige Lösung besteht darin, sie im Code zu behandeln, indem Sie den Fehler abfangen, für einige Sekunden schlafen und dann erneut versuchen. Ich kenne einige, die das gemacht haben, obwohl ich es nicht empfehlen würde.
Tags und Links java jpa multithreading ejb jdbc-odbc