# JPA Timeout?



## internet (25. Apr 2022)

Hallo,

ich versuche gerade 15k Einträge in meine Datenbank zu pumpen.

Versuche ich ein normales Erstellen, dann klappt es:


```
@EJB
private CityService cityService;

// Hochladen
public void uploadCity()  {

   City city = // create....
   cityService.addCity(city);
}

// Klasse CityService
private EntityManager entityManager;

public void addCity(City city)  {
   entityManager.persist(city);
}
```

Füge ich nun aber noch eine Methode vor dem Insert ein, bekomme ich beim Versuch 15k Einträge diese Meldung.
Bei einer geringeren Zahl an Einträge, klappt es.

Code ist dann hier (hinzu kommt die Methode *findCityLanguageByPostalCodeAndCityNameAndCountryCode*


```
@EJB
private CityService cityService;



// Hochladen
public void uploadCity()  {

   City city = // create....

    CityLanguage cityLanguage = cityService.findCityLanguageByPostalCodeAndCityNameAndCountryCode(
                        city.getPostalCode(),
                        newCityLanguage.getCityName(), city.getCountryCode(), newCityLanguage.getLanguageCode());

    // Gibt es bereits, dann überschreiben
    if (cityLanguage != null) {
        // Do something
    }

   cityService.addCity(city);

}


// Klasse CityService
private EntityManager entityManager;

public void addCity(City city)  {
   entityManager.persist(city);
}
```



> Dann bekomme ich diese Meldung:
> 
> 2022-04-25 09:43:55,488 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffffc0a8b222:7486f2a5:62664ac5:1b152 in state  RUN
> 2022-04-25 09:43:55,491 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012095: Abort of action id 0:ffffc0a8b222:7486f2a5:62664ac5:1b152 invoked while multiple threads active within it.
> 2022-04-25 09:43:55,495 WARN  [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012381: Action id 0:ffffc0a8b222:7486f2a5:62664ac5:1b152 completed with multiple threads - thread default task-4 was in



Es scheint mir so, dass ich in ein Timeout laufe. Aber wie kann ich das verhinden?
Kennt jemand dieses Problem?


----------



## LimDul (25. Apr 2022)

Ohne wirklich mit dem Szenario Erfahrung zu haben: https://www.baeldung.com/jdbc-batch-processing

Alternativ zwischendurch mal commits durchführen (sofern sinnvoll & möglich)


----------



## KonradN (25. Apr 2022)

Und wenn ich es auf die Schnelle richtig gesehen habe, dann bist Du ja schlicht in einen Timeout gelaufen. Es könnte eine Idee sein, hier dann ggf. die Timeouts hoch zu setzen. Dies kann eine schnelle und einfache Lösung ohne Codeanpassungen sein aber kann andere, negative Effekte haben, so dass ich dies nicht ohne tiefere Analysen machen würde. (Kann sonst negative Folgen haben, wenn an andere Stellen es schlicht zu lange dauert, bis ein Timeout kommt).

Aber macht ja durchaus Sinn, diese Möglichkeit einmal zu erwähnen (Und wenn es einmalige Imports sind, dann kann es durchaus Sinn machen. Dann wird die Konfiguration des Application Servers z.B. angepasst, der Import durchgeführt und dann wieder die alten Settings eingestellt.)


----------



## internet (26. Apr 2022)

LimDul hat gesagt.:


> Ohne wirklich mit dem Szenario Erfahrung zu haben: https://www.baeldung.com/jdbc-batch-processing
> 
> Alternativ zwischendurch mal commits durchführen (sofern sinnvoll & möglich)


danke....

Aber wie geht das nur mit persist?


```
entityManager.persist(city);
```


----------



## LimDul (26. Apr 2022)

Nope, es gibt explizite Commit Methoden.
*Aber* diese sollte man in einer Container Managed Transaction Umgebung wie JavaEE oder Spring nicht verwenden. Da sollte man sich man die entsprechenden Logiken des Frameworks bzgl. Transaktionssteuerung anschauen um z.B. eine Methode als eigene Transaktion zu definieren und darüber zu steuern.


----------



## internet (26. Apr 2022)

LimDul hat gesagt.:


> Nope, es gibt explizite Commit Methoden.
> *Aber* diese sollte man in einer Container Managed Transaction Umgebung wie JavaEE oder Spring nicht verwenden. Da sollte man sich man die entsprechenden Logiken des Frameworks bzgl. Transaktionssteuerung anschauen um z.B. eine Methode als eigene Transaktion zu definieren und darüber zu steuern.


wie meinst du das genau?
Ich habe meine Methoden nicht per Transaktionssteuerung annotiert....
Wie sollte ich das in dem oben beschriebenen Fall machen?


----------



## thecain (26. Apr 2022)

Was für einen Application Server verwendest du?


----------



## internet (26. Apr 2022)

Ich verwende Wildfly


----------



## thecain (26. Apr 2022)

Dann hast du 2 Möglichkeiten das Problem zu "umgehen", entweder global das Timeout höher stellen oder für die jeweilige Methode mit @TransactionTimout die Zeit setzen. Bei zweiterem musst du aufpassen, das die Transaktion auch wirklich da startet. ZB mit TransactionAttribute = RequiresNew.

Siehe auch: http://www.mastertheboss.com/jbossa...ease-the-transaction-timeout-in-jboss-wildfly


----------



## internet (26. Apr 2022)

Das mit  @TransactionTimout hatte ich tatsächlich auch schon versucht - aber ich habe keinen Import von bekommen?
Ich verwende Wildfly 21




Edit:








						Java EE Transaction Timeout unter Verwendung des JBoss WildFly erhöhen
					

Es kommt immer wieder vor, dass Methoden länger benötigen als der darum liegende Transaktionsrahmen zulässt und man in einen Transaction…




					blog.coodoo.io


----------



## thecain (26. Apr 2022)

Du brauchst die Dependency jboss-ejb3-ext-api im scope provided


----------



## stg (13. Mai 2022)

internet hat gesagt.:


> Das mit @TransactionTimout hatte ich tatsächlich auch schon versucht - aber ich habe keinen Import von bekommen?



Du hast da auch nen Tippfehler.
Es heißt @TransactionTim*e*out


----------

