Exact Online erreicht Tageslimit seit Invantive Data Hub 26.0.X

Seit der Version 26.0.X von Data Hub stoßen wir auf das Erreichen des täglichen Limits der API-Anfragen für ein Exact Online-Dossier. Zuvor war dies noch nicht der Fall.

Derzeit analysieren wir, wo das Problem liegt. Im Erneuerungsplan war das SalesOrderLines-Endpoint noch mit 312k+ Zeilen aufgenommen, was eine logische Ursache für einen hohen Verbrauch darstellte. Diese wurde vorerst aus der Erneuerung herausgenommen.

Dennoch stoßen wir erneut an die Grenze, im Folgenden ein Überblick über die Endpunkte und eine grobe Schätzung der erwarteten Anzahl der Anfragen. Dies führt zu einer geschätzten Anzahl von Anfragen von etwa 3,4k (berücksichtigt man, dass hier wahrscheinlich noch andere Anfragen rund um Refresh-Tokens etc. anfallen).

Daher bleiben wir unserer Schätzung nach unter dem Limit von 5k pro Tag. Übersehen wir etwas, wodurch die Anzahl der Anfragen drastisch höher wäre als geschätzt?

Tabelle tpn_count_rows Ergebnisse pro Anfrage? Benötigte API-Anfragen?
ExactOnlineREST.PurchaseOrder.GoodsReceiptLines 20182 60 336
ExactOnlineREST.PurchaseOrder.GoodsReceipts 1750 60 29
ExactOnlineREST.Purchase.PurchaseInvoices 1038 60 17
ExactOnlineREST.Purchase.PurchaseInvoiceLines 20053 60 334
ExactOnlineREST.Logistics.ItemAssortments 10 60 0
ExactOnlineREST.Logistics.ItemAssortmentProperties 558 60 9
ExactOnlineREST.Financial.Journals 25 60 0
ExactOnlineREST.Financial.FinancialPeriods 72 60 1
ExactOnlineREST.Incremental.GLAccountsIncremental 830 1000 1
ExactOnlineREST.Incremental.TransactionLinesIncremental 492070 1000 492
ExactOnlineXML.XML.Items 8588 60 143
ExactOnlineREST.Logistics.ItemsBulk 8588 1000 9
ExactOnlineXML.XML.AROutstandingItems 427 60 7
ExactOnlineREST.Subscription.SubscriptionLineTypes 2 60 0
ExactOnlineREST.Subscription.SubscriptionLines 2 60 0
ExactOnlineREST.Subscription.Subscriptions 2 60 0
ExactOnlineREST.Subscription.SubscriptionTypes 4 60 0
ExactOnlineREST.HRM.Costunits 43 60 1
ExactOnlineREST.HRM.Costcenters 4 60 0
ExactOnlineREST.SalesInvoice.SalesInvoicesBulk 22474 1000 22
ExactOnlineREST.SalesInvoice.SalesInvoiceLinesBulk 326384 1000 326
ExactOnlineREST.SalesOrder.GoodsDeliveryLinesBulk 298456 1000 298
ExactOnlineREST.SalesOrder.GoodsDeliveriesBulk 35471 1000 35
ExactOnlineREST.SalesOrder.SalesOrders 27720 60 462
ExactOnlineREST.SalesOrder.SalesOrdersBulk 27720 1000 28
ExactOnlineREST.SalesOrder.SalesOrderLinesBulk 312594 1000 313
ExactOnlineREST.CRM.AccountClassifications 37 60 1
ExactOnlineREST.CRM.AddressesBulk 11560 1000 12
ExactOnlineREST.CRM.ContactsBulk 4415 1000 4
ExactOnlineREST.CRM.AccountsBulk 10330 1000 10
ExactOnlineREST.Logistics.SupplierItems 7989 60 133
ExactOnlineREST.PurchaseOrder.PurchaseOrders 1040 60 17
ExactOnlineREST.PurchaseOrder.PurchaseOrderLines 19986 60 333

Die tatsächlichen API-Aufrufe sind im Bildschirm “Sitzung-I/O” auf Invantive Cloud zu finden. Hier sind auch On-Premises-Messungen enthalten.

Es wird empfohlen, diese zu nutzen, um die größten Verbraucher zu ermitteln.

„Sitzung-I/Os“ weisen auf folgende Erkenntnisse hin, gefiltert nach der Partition der Problemverwaltung.

Übersicht der Anzahl vorhandener I/Os gruppiert nach „Tabellenname“.

Zeilenbeschriftungen Anzahl der Sortierreihenfolge
ExactOnlineREST.Incremental.TransactionLinesIncremental (neu/geändert) 999
ExactOnlineREST.SalesOrder.SalesOrders 926
ExactOnlineREST.PurchaseOrder.GoodsReceiptLines 674
ExactOnlineREST.Purchase.PurchaseInvoiceLines 670
ExactOnlineREST.SalesInvoice.SalesInvoiceLinesBulk 654
ExactOnlineREST.SalesOrder.SalesOrderLinesBulk 626
ExactOnlineREST.SalesOrder.GoodsDeliveryLinesBulk 598
ExactOnlineREST.PurchaseOrder.PurchaseOrderLines 317
ExactOnlineXML.XML.Items 172
ExactOnlineREST.SalesOrder.GoodsDeliveriesBulk 72
ExactOnlineREST.PurchaseOrder.GoodsReceipts 60
ExactOnlineREST.SalesOrder.SalesOrdersBulk 56
ExactOnlineREST.SalesInvoice.SalesInvoicesBulk 46
ExactOnlineREST.Purchase.PurchaseInvoices 36
ExactOnlineREST.Logistics.ItemAssortmentProperties 20
ExactOnlineREST.Logistics.ItemsBulk 18
ExactOnlineREST.Workflow.CustomerCooperations 12
ExactOnlineREST.Incremental.TransactionLinesIncremental/$count 6
ExactOnlineREST.Incremental.TransactionLinesIncremental (gelöscht) 4
ExactOnlineREST.Incremental.GLAccountsIncremental/$count 4
ExactOnlineREST.Incremental.TransactionLinesIncremental (Metadaten) 4
ExactOnlineREST.Financial.FinancialPeriods 4
ExactOnlineREST.Incremental.GLAccountsIncremental (neu/geändert) 2
ExactOnlineREST.Subscription.SubscriptionLineTypes 2
ExactOnlineREST.Logistics.ItemAssortments 2
ExactOnlineREST.Subscription.SubscriptionLines 2
ExactOnlineREST.Incremental.GLAccountsIncremental (Metadaten) 2
ExactOnlineREST.Subscription.Subscriptions 2
ExactOnlineREST.Incremental.GLAccountsIncremental (Zeitmaschine) 2
ExactOnlineREST.Financial.Journals 2
ExactOnlineXML.XML.AROutstandingItems 2
ExactOnlineREST.Incremental.GLAccountsIncremental (gelöscht) 2
ExactOnlineREST.HRM.Costcenters 2
ExactOnlineREST.Subscription.SubscriptionTypes 2
ExactOnlineREST.HRM.Costunits 2
Gesamtsumme 6004

Folgendes fällt auf:

ExactOnlineREST.Incremental.TransactionLinesIncremental (neu/geändert)

  • Dieser Wert ist hoch ausgefallen und nicht erwartet
  • Dieses Refresh wird durch folgende Anweisung initiiert:
select /*+ ods(true, interval '1 seconds') */ count(*) 
from   ExactOnlineREST.Incremental.TransactionLinesIncremental@eolbe;
  • Stellt dies ein Problem dar, wodurch dieser Wert so hoch ausfällt?

Bulk-Tabellen mit einer hohen Anzahl von Aufrufen

  • 654 Aufrufe auf ExactOnlineREST.SalesInvoice.SalesInvoiceLinesBulk
  • Diese Tabelle enthält ähnlich der ursprünglichen Tabelle etwa 300.000 Datensätze.
  • Hier würde ich daher 300 Aufrufe erwarten, da eine Bulk-Tabelle pro Aufruf 1000 Datensätze liefert?

Der Rat lautet, die Anzahl der API-Aufrufe an die Anzahl der Zeilen anzupassen. Dies kann schnell über die Tipps unter folgendem Link geschehen:

Ein *Incremental wird normalerweise etwa 1.000 API-Aufrufe nur bei der initialen Ladung oder wenn etwas nicht stimmt, durchführen (zum Beispiel bei einer zu großen Abweichung zwischen dem, was im Cache steht und der Anzahl der Zeilen).

Aus den 4 API-Aufrufen bei (deleted) lässt sich zumindest ablesen, dass in der gemessenen Periode viermal eine vollständige Aktualisierung stattgefunden hat.

Dies kann analysiert werden, indem man in den Sitzungs-I/Os nachsieht, wann und unter welcher Sitzungs-ID die Aufrufe stattfinden.

Ähnliches gilt für *Bulk-Tabellen: Im Bildschirm Sitzungs-I/Os gibt es Hinweise, wann ein Aktualisierungsvorgang stattfindet. Anders als bei *Incremental wird jedoch jeder neue Ladevorgang (bei 300.000 Zeilen in SalesInvoiceLinesBulk) etwa 300 API-Aufrufe erzeugen. Wird eine Sekunde später dieselbe Abfrage erneut ausgeführt, werden wieder etwa 300 API-Aufrufe generiert, usw.

Dies könnte mit den 4 API-Aufrufen bei (deleted) übereinstimmen. Möglicherweise hat ein Skript mehrfach innerhalb der gemessenen Periode ausgeführt.

Das Skript startet um 07:30 Uhr CET über den Windows Taskplaner und erstellt dabei eine Protokolldatei. Auf Serverebene kann ich nur eine Protokolldatei finden.

Die I/Os stammen alle von dem Lauf, der an diesem Morgen gestartet wurde, und stimmen zeitlich mit den Protokollen überein:

Start:

2026-07-03 05:30:12.399 Information itgensql264: Invantive UniversalSQL-Abfrage gestartet.

Stop:

2026-07-03 09:20:22.922 Fehler itgencun016: Fehler itgeneor229: Es ist keine tägliche Kapazität mehr verfügbar für die Nutzung der Exact Online API in der Exact Online Abteilung '……'.
  Bitte optimieren Sie Ihre API-Nutzung oder kontaktieren Sie den Exact Online Support, um mehr API-Aufrufe pro Tag als das aktuelle Limit von 5.000 Aufrufen zu erhalten, oder versuchen Sie es morgen erneut.

Die Datei mit den Abfragen hat folgenden Aufbau:

use 123@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrderLinesBulk@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrdersBulk@eolbe;
... andere Tabellen ...

use 456@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrderLinesBulk@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrdersBulk@eolbe;
... andere Tabellen ...

use 789@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrderLinesBulk@eolbe;
SELECT /*+ ods(true, interval '1 seconds') */ count(*) FROM ExactOnlineREST.SalesOrder.SalesOrdersBulk@eolbe;
... andere Tabellen ...

Der Rat ist, die Informationen aus den Sitzungs-I/O’s mit den in den Logdateien verwendeten, einschließlich der Zeitpunkte, abzugleichen.

Derzeit gibt es keinen Grund, von einem Fehler auszugehen.

Gibt es dazu eine schriftliche Vorgehensweise?

Ich verstehe den konkreten Schritt, den ich ausführen muss, noch nicht vollständig.

Nein, hierfür gibt es aktuell weder ein Verfahren noch eine Planung.

Der Rat ist, entweder einen erfahrenen Berater hinzuzuziehen oder über Claude AI um Rat zu fragen.

Untersuchung mit Claude AI wurde durchgeführt, mit folgendem Input:

  • I/O’s vom 03.07.2026 sync
  • Log vom 03.07.2026 sync (Fehler)
  • Log vom 10.06.2026 sync (erfolgreich, noch auf v24)

Hier einige Punkte, die möglicherweise relevant sind?

Keine 1000 Datensätze / Aufruf

Der Fingerabdruck der Regression liegt in den Zeilen-pro-Aufruf im Juli. Aus dem I/O-Export ergibt sich, dass jede große Tabelle im Juli fast genau ~500 Zeilen pro Aufruf zurückgibt:

TransactionLines: 492.070 Zeilen / 999 Aufrufe = 492/Aufruf
SalesOrderLinesBulk: 312.594 / 626 = 499/Aufruf
SalesInvoiceLinesBulk: 326.384 / 654 = 499/Aufruf
GoodsDeliveryLinesBulk: 298.456 / 598 = 499/Aufruf

Exact Online's Bulk- und Sync-Endpunkte geben bis zu 1.000 Zeilen pro Seite zurück. Ein uniformes ~500 über vier unabhängige Tabellen zu erhalten, ist kein Zufall — es ist eine Seitengröße von 500, das heißt Halbseitengrößen, doppelt so viele Aufrufe für dieselben Daten. Wendet man diese Verdoppelung auf TransactionLines plus die drei Bulk-Tabellen an, erhält man ungefähr 1.800–1.900 Aufrufe, die eine 1.000-Zeilen-Seite in ~950 bedient hätte.

ODS Intervall 1 Sekunde

Wird eine inkrementelle Tabelle stets ergänzt, wenn das „/*+ ods(true, interval ‘1 seconds’) */“ Element weggelassen wird?

Derzeit würde dies dazu führen, dass stets ein vollständiger Sync stattfindet?

Der Rat ist, die Beziehung zu Zeitpunkten herzustellen; es klingt nach mehreren Ladevorgängen. Exact Online kennt nur von Exact genau vorgeschriebene Seitengrößen.

Der Hinweis ods hat keinen Einfluss auf die Logik für inkrementelle Tabellen oder HTTP-Caches; siehe auch:

Vielen Dank für das Feedback. Ich habe die Ein-/Ausgänge (I/O) pro Zeitpunkt neben die Protokolldatei gelegt, wie empfohlen, und das Bild von mehreren Loads wird bestätigt. Heute läuft die Erneuerung zurück und wir beobachten, ob dies erneut ein Limit auslöst.

Einsichten von KI:

Kontext: Data Hub 26.0.167. Der Refresh lief am 03.07 von 05:30 bis zum Absturz um 09:20:22 auf itgeneor229 („keine tägliche Kapazität mehr verfügbar … das aktuelle Limit von 5.000 Aufrufen“). Der I/O-Export enthält 6.004 Anfragen, wovon ca. 5.990 in diesem einen Fenster.

1. Seitengröße stimmt. Pro Durchgang ruft Data Hub ca. 999 Zeilen/Aufruf ab (z.B. 312.594 Zeilen / 313 Aufrufe), also die von Exact vorgeschriebenen ca. 1.000. Mein vorheriger „500/Aufruf“ war ein Zählfehler: Ich teilte die gespeicherte Zeilenanzahl durch die Gesamtanzahl der Aufrufe über zwei Durchgänge.

2. Jede große Tabelle wird zweimal abgerufen. Wenn ich die Anfragen nach Zeitpunkt sortiere, zerfällt jede große Tabelle in zwei nahezu identische Durchgänge mit einer inaktiven Lücke dazwischen (0 Aufrufe während der Lücke), während das Protokoll nur ein Downloaded … rows registriert:

Tabelle Durchgang 1 Durchgang 2 Protokoll „Downloaded“
SalesOrderLinesBulk 05:34–05:45 (313 Aufrufe / 417 MB) 05:57–06:08 (313 Aufrufe / 421 MB) 312.594 Zeilen (1×)
SalesInvoiceLinesBulk 07:27–07:34 (327 Aufrufe) 07:40–07:48 (327 Aufrufe) 326.384 Zeilen (1×)
GoodsDeliveryLinesBulk 07:01–07:11 (299 Aufrufe) 07:17–07:26 (299 Aufrufe) 298.456 Zeilen (1×)
TransactionLinesIncremental 08:22–08:25 (500 Aufrufe) 08:38–08:42 (499 Aufrufe) 492.070 Zeilen (1×)
XML Items 07:54–07:57 (86 Aufrufe) 08:00–08:03 (86 Aufrufe) —

Die beiden Durchgänge sind bytegenau symmetrisch (z.B. 417 vs. 421 MB für SalesOrderLinesBulk). Die Daten werden also einmal gespeichert, aber zweimal abgerufen.

3. Einfluss auf das Tageslimit. Zusammen sind die zweiten Durchgänge ca. 1.524 Aufrufe. Ohne diese Wiederholung kommt der Lauf auf ca. 4.480 Aufrufe — unter dem Limit von 5.000. Die Überschreitung kommt also nicht durch Seitengröße oder den Sync-Anker, sondern durch den doppelten Abruf.

4. Vergleich mit einem erfolgreichen Lauf (09.06, Data Hub 24.0.445, gleiches ods=1s): das Protokoll zeigt dort ein Downloaded … rows pro Tabelle und der Lauf endete ohne Tageslimit, mit vergleichbaren (sogar größeren) Volumina auf Divisionscode. Anmerkung: dieses ältere Protokoll enthält keine I/O auf Anfragenebene, daher kann ich die Anzahl der Aufrufe für Juni nicht exakt zählen — der doppelte Abruf ist nur im 26.0.167-Export sichtbar.

Frage: Könnt ihr helfen zu erklären, warum jede Bulk/Sync-Tabelle in zwei Durchgängen abgerufen wird? Konkret:

  • Lösen das ODS-Seeding und das anschließende SELECT count(*) jeweils einen separaten Abruf aus?
  • Worauf wartet der Lauf während der inaktiven Lücke von ca. 6–12 Minuten zwischen den beiden Durchgängen?

Auf Basis der Informationen lässt sich darüber wenig sagen.

Es wird empfohlen:

  • die regelmäßige Aktualisierung auszuschalten
  • Invantive Trace zu aktivieren, wie beschrieben unter Provide Support with Data Hub and other on-premises products
  • den Job einmal auszuführen
  • den Job erneut auszuführen
  • die Trace-Dateien zu zippen und an support@invantive.eu mit Angabe der URL zu senden

Das Tracking ist aktiv, ich nehme an, dass es vorzugsweise ein Tracking ist, das nach einem Zurücksetzen des täglichen Limits beginnt?

Richtig, damit itgeneor229 nicht der Vollständigkeit halber alles durcheinander bringt.

Das Versenden der .zip-Datei führt zu einer „Unzustellbarkeitswarnung“.

Die Nachricht enthält 3 „.zip“-Dateien mit insgesamt nur 600kb.

Das Tracing wurde heute geliefert.

Beachten Sie, dass diese Erneuerung auf der Umgebung läuft, in der eine 2. Verbindung mit demselben Datencontainer-Namen vorhanden ist. Dies könnte folglich ein Nebeneffekt sein von: Falsche Verbindung wird bei Invantive Data Hub Release 26.0 gewählt - invantive?

Die drei Dateien wurden analysiert. Diese Traces enthalten nicht den eigentlichen Refresh-Zyklus. Es sind nur die ersten Dateien beim Prozessstart und umfassen einige Sekunden.

Auffällig ist, dass es sich um drei separate Prozesse handelt, die im Abstand von wenigen Minuten gestartet werden. Für den Test ist es erforderlich, das Programm vollständig laufen zu lassen und dann zu wiederholen. Da 5.000 API-Calls erforderlich sind, muss das mindestens 5.000 Sekunden dauern.

Es wird empfohlen, Traces von den vollständigen Durchläufen zu sammeln und zu senden. Am besten nach einem Upgrade auf 26.0.169, das jetzt als “aktuelle” Version auf https://download.invantive.com verfügbar ist.

Das Update auf 26.0.170 war vorgesehen und läuft jetzt.

Die drei Durchläufe waren eine begrenzte Simulation einer Tabelle, die dreimal nacheinander gestartet wurde.

Claude AI gab dabei Feedback, dass die API-Tabelle zwei Mal kurz hintereinander ausgelesen würde, jedoch nur nebenbei erwähnt.

Sobald die Durchläufe mit der neuen Version abgeschlossen sind und das Problem weiterhin besteht, werden die neuen Traces bereitgestellt.

Eine interne Analyse aufdeckte einen Trend, bei dem die Anzahl der API-Aufrufe für AccountsIncremental (Kundentabelle) mit der Version 26.0 tendenziell höher liegt als bei der Version 25.0 in einer Testadministration in Exact Online.

In dieser Administration gibt es circa 100.000 Beziehungen und eine Abfrage liest AccountsIncremental 10 bis 20 Mal pro Tag aus.

Version Anzahl der Aufrufe pro Tag
25.0.190 220
25.0.205 391
25.0.210 112
25.0.211 145
26.0.011 2283
26.0.054 319
26.0.066 569
26.0.069 1091
26.0.148 1920
26.0.164 724
26.0.167 3690

Für die aktuelle Version 26.0.167 gibt es eine Trace, die für die Analyse verwendet wird.

Das Tracing des 26.0.170-Updates wurde über einen Download-Link an den Invantive Support geliefert.