Es ist nicht möglich, eine Batch-Anweisung auszuführen.

Erkanovicz

Mitglied
Hallo zusammen,

ich bin, was Java betrifft, völlig unbeleckt und kann daher nicht genau sagen, in welches Thema meine Anfrage passt.

Ich betreue ein Datenmanagementsystem, welches via JBOSS läuft, wenn ich mich richtig ausdrücke. Die Datenbank dahinter läuft über unseren SQL Server.
Seit ca. zwei Tagen erhalte ich immer wieder die gleichen ERROR Meldungen im Log und würde gerne wissen, was es für mich bedeutet, oder was im allgemeine dahinter stecken könnte.

Java:
de.easy.e3.storage.sqlindexstorage.SQLStorageException: de.easy.e3.storage.dbabstraction.DBExecuteException: Es ist nicht möglich, eine Batch-Anweisung auszuführen.
    at de.easy.e3.storage.AbstractTransaction.execute(AbstractTransaction.java:115)
    at de.easy.e3.storage.TransactionContext.execute(TransactionContext.java:374)
    at de.easy.e3.storage.server.StorageBridgeServer.insert(StorageBridgeServer.java:340)
    at de.easy.e3.storage.server.StorageBridgeServer.insert(StorageBridgeServer.java:596)
    at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: de.easy.e3.storage.dbabstraction.DBExecuteException: Es ist nicht möglich, eine Batch-Anweisung auszuführen.
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatchExecute(UnitOfWork.java:515)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatch(UnitOfWork.java:559)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.executeBatch(UnitOfWork.java:405)
    at de.easy.e3.storage.AbstractTransaction.execute(AbstractTransaction.java:103)
    ... 19 more
Caused by: java.sql.BatchUpdateException: Bei der Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2085)
    at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatchExecute(UnitOfWork.java:485)
    ... 22 more


Das ist die erste Meldung und anschließend kommt folgende Meldung:

Java:
de.easy.e3.storage.StorageException: Kann nicht ausgeführt werden. Ein Rollback wird durchgeführt.
    at de.easy.e3.storage.TransactionContext.execute(TransactionContext.java:541)
    at de.easy.e3.storage.server.StorageBridgeServer.insert(StorageBridgeServer.java:340)
    at de.easy.e3.storage.server.StorageBridgeServer.insert(StorageBridgeServer.java:596)
    at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: de.easy.e3.storage.sqlindexstorage.SQLStorageException: de.easy.e3.storage.dbabstraction.DBExecuteException: Es ist nicht möglich, eine Batch-Anweisung auszuführen.
    at de.easy.e3.storage.AbstractTransaction.execute(AbstractTransaction.java:115)
    at de.easy.e3.storage.TransactionContext.execute(TransactionContext.java:374)
    ... 18 more
Caused by: de.easy.e3.storage.dbabstraction.DBExecuteException: Es ist nicht möglich, eine Batch-Anweisung auszuführen.
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatchExecute(UnitOfWork.java:515)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatch(UnitOfWork.java:559)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.executeBatch(UnitOfWork.java:405)
    at de.easy.e3.storage.AbstractTransaction.execute(AbstractTransaction.java:103)
    ... 19 more
Caused by: java.sql.BatchUpdateException: Bei der Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2085)
    at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatchExecute(UnitOfWork.java:485)
    ... 22 more

Sagt das einem von euch etwas?
Ich danke euch im Voraus für eure Hilfe.
 
Die Ursache ist wohl:
Code:
Caused by: java.sql.BatchUpdateException: Bei der Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2085)
    at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
    at de.easy.e3.storage.dbabstraction.UnitOfWork.forEachBatchExecute(UnitOfWork.java:485)
    ... 22 more
 
Du hast ein Problem mit den Daten in der Datenbank.

Generell wird so ein Stacktace von unten nach oben gelesen. Die eigentliche Fehlermeldung ist also:
Bei der Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.

Also wird da eine Konvertierung versucht, die bei mindestens einem Wert nicht möglich ist.

Mit dem Stacktrace an den Hersteller gehen - der kann da bestimmt näheres sagen incl. Unterstützung um die fehlerhaften Datensätze zu identifizieren und zu reparieren.
 
Google sagt:
DATETIME2 has a date range of "0001 / 01 / 01" through "9999 / 12 / 31" while the DATETIME type only supports year 1753-9999. Also, if you need to, DATETIME2 can be more precise in terms of time; DATETIME is limited to 3 1/3 milliseconds, while DATETIME2 can be accurate down to 100ns. Both types map to System.

Das heißt meine Vermutung ist, dass irgendwo in der DB ein Datum vor dem Jahr 1753 gespeichert ist.
 
Wie ich vorgehen würde - versuchen das Statement zu identifzieren - ggf. Logging aktivieren, dass die SQL-Statements geloggt werden. Dann sollte es, wenn man es darüber schafft, recht einfach finden.

Alternativ schauen, ob man die Statements durch Code-Analyse rausfinden kann (du wirst ja hoffentlich den Context kennen, in dem das Problem auftritt). Dann kann man damit die Tabellen einschränken.

Wenn alle Stricke reißen - der SQL Server hat hoffentlich analog wie Oracle ein Meta-Schema, wo man Abfragen kann welche Tabellen & Spalten es gibt - damit kann man sich mit Sicherheit alle Spalten mit DATETIME2 ausgeben lassen und auch selects basteln, die auf kleiner 1753 selektieren.
 
Jetzt habe ich den Fehler gefunden. Da Anwender hat beim Datum XX.XX.202 geschrieben und das hat alles zu aufhängen gebracht 🙂
Vielen Dank für eure Mühe und Eure Hilfe.
Es ist super, dass du den Datensatz gefunden hast. Würde ich aber dennoch an den Entwickler / Hersteller geben. Das ist aus meiner Sicht ein klarer Software-Fehler. Es kann nicht sein, dass Daten geschrieben werden, die dann nicht mehr gelesen werden können ... (Meiner Meinung nach).
 
Nach Prüfung hat sich folgendes ergeben:

Der Datensatz wurde automatisch eines OCR System so angenommen und übergeben. Da es sich um einen schlechte Kopie gehandelt hat, sehe ich hier mal davon ab, mit dem Dienstleister zu sprechen 🙂 Schließlich schleusen wir tausende Belege durch das System.

Nochmal danke an alle Beteiligten.
 
Nach Prüfung hat sich folgendes ergeben:

Der Datensatz wurde automatisch eines OCR System so angenommen und übergeben. Da es sich um einen schlechte Kopie gehandelt hat, sehe ich hier mal davon ab, mit dem Dienstleister zu sprechen 🙂 Schließlich schleusen wir tausende Belege durch das System.

Nochmal danke an alle Beteiligten.
Erinnert mich irgendwie an
😁😁😁
 

Zurück
Oben