JPA Timeout?

internet

Top Contributor
Hallo,

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

Versuche ich ein normales Erstellen, dann klappt es:

Code:
@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

Code:
@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?
 

KonradN

Super-Moderator
Mitarbeiter
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.)
 

LimDul

Top Contributor
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

Top Contributor
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?
 

Ähnliche Java Themen


Oben