# Asynchrone Aufrufe mit jdbc



## derFabi95 (27. Okt 2021)

Folgenden Pseudo-Code möchte ich gerne umsetzen:

```
Testklasse1 test1 = null;
if(setTestKlasse1()) {
    test1 = new Testklasse1("Test 1");
    Test1Service ts = new Test1Service();
    ts.persist(test1);
    test1 = ts.loadByName(test1.getName())
}

Testklass2 test2 = new Testklasse2("Test 2", test1 == null ? null : test1.getId());
Test2Service ts2 = new Test2Service();
ts2.persist(test2);
```

Was ich hier erreichen möchte ist eine Art Fremdschlüsselbeziehung zu wrappen.
Also Testklasse2 KANN als Konstruktor-Parameter 2 entweder null übergeben bekommen wenn keine Fremdschlüsselbeziehung vorhanden sein soll oder eben die ID des bezogenen Objekts test1.
ts.persist() ist eine Funktion, welche letztendlich ein INSERT durchführt.
Damit nun die ts.loadByName() auch das korrekte, in der DB gespeicherte Objekt mit der ID zurückerhält, müsste ja gewartet werden bis der persist-Vorgang abgeschlossen ist.
Aber selbst wenn ich das mittels einer CompletableFuture-Async-Funktion durchführe, würde ja die test2 nicht das korrekte test1-Objekt bekommen, sondern nur null.

So wie ich das sehe müsste ich alle weiteren Schritte dann wirklich in eine .thenRunAsync() setzen, was aber redundanten Code bedeuten würde.
Gibt es hier eine bessere oder schönere Lösung?
Ich habe bereits mit JPA gearbeitet wo das zwar super funktioniert, das ist jedoch für meine Zwecke nicht wirklich nutzbar.


----------



## mrBrown (27. Okt 2021)

derFabi95 hat gesagt.:


> Gibt es hier eine bessere oder schönere Lösung?


Naja, wenn asynchrone Aufrufe dort stören: entweder keine asynchronen Aufrufe nutzen oder mit `get()` das ganze wieder blockierend machen?


----------



## derFabi95 (27. Okt 2021)

mrBrown hat gesagt.:


> Naja, wenn asynchrone Aufrufe dort stören: entweder keine asynchronen Aufrufe nutzen oder mit `get()` das ganze wieder blockierend machen?


Was heißt stören - ich kann ja nicht den asynchronen Aufruf nur innerhalb der if() machen. Sodass, abhängig davon ob in die if() gegangen wird oder nicht, etwas async ausgeführt wird und der rest danach wartet darauf oder eben nicht.
Wie meinst du mit `get()` blockieren?


----------



## mrBrown (27. Okt 2021)

derFabi95 hat gesagt.:


> Wie meinst du mit `get()` blockieren?


CompletableFuture#get


----------



## derFabi95 (27. Okt 2021)

Danke.
Weil du meintest ich soll keine asynchronen Aufrufe nutzen:
Dann blockiert doch eine ggf.  langsame Serververbindung oder hohe Load am DB-Server oder was auch immer die weitere Ausführung des Main-Threads, oder?


----------



## mrBrown (27. Okt 2021)

Ja, der jeweilige Thread würde dann blockieren – aber das ist nicht zwingend ein Problem und/oder kann auf einer höheren Ebene besser gelöst werden. 
Wenn man bei sowas asynchron arbeiten will, muss man sich vor allem auch gut überlegen, an welchen Stellen das sinnvoll möglich ist und die Nachteile in Kauf nehmen.


----------

