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!
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. –
"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
M. Dienum richtig Ich habe meine Antwort gelöscht. –