2016-07-28 9 views
0

Ich habe eine Singleton-KlasseA (container-verwaltete Transaktion), die methodA mit @Asynchronous für das Speichern/Verarbeiten großer Datenmengen in die Datenbank.MethodeA teilt die Datensätze und übergibt an Methode B mit @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) annotiert, so dass Datensätze in Chunks gespeichert und zugeordnet werden können (ich sage map, weil die Datensätze anderen Tabellen in sys zugeordnet werden, was Zeit benötigt). Dies wurde in dem Gedanken eingebaut, dass eine neue Transaktion für methodB von dem Elternteil gegeben wird, um ein einzelnes Transaktions-Rollback zu vermeiden. Nun, was passiert, während Methode B endet..MethodeA (asynch method) timeout. Ich habe versucht @ Accesstimeout (-1), so dass es wartet, bis Methode B abgeschlossen ist. aber immer noch liegt der Fehler vor. Muss ich in diesem Fall die Bean-gesteuerte Transaktion aktivieren? oder ist es noch möglich mit COntainer verwalteten Transaktion.TransactionRollback-Ausnahme während der asynchronen Verarbeitung großer Batch-Datensätze in Singleton-Bean

Antwort

0

Ich vermute, dass Sie Ihr Problem schon lange gelöst haben. Jedenfalls versuche ich, meinen Grund für die mögliche Ursache zu erklären.

Wie Sie wissen, wird beim Aufruf einer als REQUIRES_NEW gekennzeichneten Methode B Ihre aktuelle Transaktion gehalten, und eine neue Transaktion wird dann der Ausführung der Methode B zugewiesen.

Nach dem Abschluss der Methode B wird die zugehörige Transaktion festgeschrieben und die Transaktion "Anhalten" setzt die Ausführung fort.

Wenn Sie jetzt einen Iterationsaufruf haben, wird die ursprüngliche Transaktion gehalten, bis die Schleife beendet ist. Haben Sie versucht, die @Asynchronous Methode als NOT_SUPPORTED

annotieren. Übrigens, ich habe immer Message Driven Bean viel bequemer für diese Art von Funktionalität gefunden.

Verwandte Themen