0

wir erleben das folgende Problem: Wir haben einige Service-Bean, die einige Behandlung und Iterieren über einen Satz und starten einen asynchronen Thread für jeden Eintrag, der aussehen wird wie folgt vor:Spring Boot propagieren Transaktion (und Db-Verbindung) zu @ Async-Methode

@Service 
public class ServiceBean { 
    @Autowired 
    private AsyncHandler asyncHandler; 

    public void doService(Set<?> theSet) { 
    for (Object obj : theSet) { 
     Future<?> future = asyncHandler.doHandle(obj); 
     // ... 
    } 
    // wait for all futures to complete 
    } 
} 

@Service 
public class AsyncHandler { 
    @Async 
    public Future<?> doHandle(Object object) { 
    // dosth 
    return future; 
    } 
} 

Jetzt sehen wir, dass jeder Thread seine eigene Transaktion halten und damit die Datenbankverbindung, die die Verbindung Pool läuft leer sehr schnell verursachen.

Was ist die gewünschte Möglichkeit, die Transaktion über alle Threads hinweg zu teilen?

Vielen Dank im Voraus!

+3

Sie können nicht. Die Transaktion und die Verbindung werden in einem ThreadLocal gespeichert. Eine Transaktion kann nicht mehrere Threads umfassen. Beschränken Sie die Anzahl der gleichzeitigen Threads, die Sie haben können, ist die einfachste Lösung. –

+0

"Sie können nicht" ... Ich wette, Sie können, vielleicht Anpassung Frühling wäre notwendig. Bei der Transaktion in einem ThreadLocal gibt es möglicherweise die Möglichkeit, sie im neuen Thread abzurufen und festzulegen. – Benny

+0

M. Dienum richtig Ich habe meine Antwort gelöscht. –

Antwort

4

Was ist die gewünschte Möglichkeit, die Transaktion über alle Threads zu teilen?

Tun Sie das nicht. Das macht es unglaublich schwer zu verstehen, was vor sich geht. Es gibt einen Grund, warum eine Transaktion an den Thread angehängt ist, der sie erstellt hat. Ich nehme an, Ihr Plan ist, all diese asynchronen Threads zu starten und dann darauf zu warten, dass sie abgeschlossen sind, um das Commit-Signal zu senden.

Wenn nicht, wer wird die Transaktion abschließen? Wenn ein Thread die Transaktion rückgängig macht, was passiert dann in anderen Threads, die ihn noch verwenden? Sie könnten natürlich die Connection passieren, aber ich würde erwarten, dass Dinge sowieso serialisiert werden, da die meisten Verbindungsimplementierungen an verschiedenen Stellen synchronized verwenden.