Bei uns kann ein Request sehr lange dauern, da mehr als 10.000 Datensätze in der Datenbank gespeichert werden müssen. Deshalb führe ich saveMyCanvasFlexview2b nicht direkt aus, sondern habe einen Timer programmiert.
Das Frontend fragt den Fortschritt kontinuierlich ab. Benutzer wird dadurch kontinuierlich über den Fortschritt des Speichervorgangs informiert.
Mit DB2 funktioniert das. Mit MariaDB hingegen funktioniert es nicht. Fehlermeldung:
In saveMyCanvasFlexview2b werden Daten zuerst alle Daten gelöscht und dann die gewünschten Daten gespeichert.
Java:
@PostMapping(value = "/db/saveMyCanvasFlexview2")
public void saveMyCanvasFlexview2(@RequestBody MyCanvasFlexViewBean myCanvasFlexViewBean, HttpSession session) {
service.saveMyCanvasFlexview2(myCanvasFlexViewBean, session);
}
Java:
@Override
@Transactional
public void saveMyCanvasFlexview2(MyCanvasFlexViewBean myCanvasFlexViewBean, HttpSession session) {
String uuidForProgress = myCanvasFlexViewBean.getUuidForProgress();
FlexViewProgressInfoDTO dto = new FlexViewProgressInfoDTO();
DBRestController.mappingUuidAndFlexViewProgressInfoDTO.put(uuidForProgress, dto);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
cancel();
saveMyCanvasFlexview2b(myCanvasFlexViewBean, dto, session);
}
}, 100);
}
Mit DB2 funktioniert das. Mit MariaDB hingegen funktioniert es nicht. Fehlermeldung:
Java:
Exception in thread "Timer-36" javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:422)
at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1679)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:406)
at com.sun.proxy.$Proxy226.executeUpdate(Unknown Source)
at com.ametras.vision.backend.service.ApplicationService2Impl.deleteFlexViewB(ApplicationService2Impl.java:5568)
at com.ametras.vision.backend.service.ApplicationService2Impl.saveMyCanvasFlexview2b(ApplicationService2Impl.java:5389)
at com.ametras.vision.backend.service.ApplicationService2Impl$7.run(ApplicationService2Impl.java:5350)
at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
at java.base/java.util.TimerThread.run(Timer.java:506)
In saveMyCanvasFlexview2b werden Daten zuerst alle Daten gelöscht und dann die gewünschten Daten gespeichert.