OFFICIUM INSERVIO
Your reliable partner for your business software...
Sage 100 Default Timeouts
(alle Versionen/all versions)
Dienstag, 8. August 2023
Vorgabe in Office Line.config-Datei
Vorgabe/Überschreiben in .net Code
Generelle Anmerkung zu Timeouts
Deutsch
Default Timeouts?
In der Sage 100 gibt es aus Sicht der Anwendungsentwicklung immer wieder Situationen, in denen aus .net Code heraus SQL-Anweisungen über die "Sagede.OfficeLine.Data.IGenericCommand"-Implementierung abgesendet werden.
Auch bei Verwendung von "Sagede.OfficeLine.Data.IGenericReader" zum Abfragen von Daten mit der Standard-Funktion "ExecuteReader()" kommt das Interface "Sagede.OfficeLine.Data.IGenericCommand" zum Einsatz.
⚠️Man kann dort über die folgende Property im "IGenericCommand" vorgeben, dass Erweiterte SQL-Timeouts verwendet werden sollen:⚠️
command.UseEnhancedTimeout = true;
Anmerkung: Setzt man bei "ExecuteReader()" oder anderen Methoden nachfolgenden Parameter, dann wird das entsprechend an die darunterliegende Implementierung ebenfalls weitergegeben.
useEnhancedTimeout: true
Es stellt sich in diesem Zusammenhang nun die Frage, welche SQL-Timeouts bei den Sage Implementierungen überhaupt zur Verwendung kommen und wie und wo diese definiert werden und ob man diese bei Bedarf anpassen kann.
Denn dies ist bedauerlicherweise nirgendwo in der Entwickler-Dokumentation näher definiert!
Recherchen im Sage System-Code zeigen, dass die nachfolgenden Timeouts als Standardwerte im Sage Quellcode initialisiert werden.
Standard-Datenzugriffe: 100 Sekunden
Standard Erweitertes Timeout: 600 Sekunden
⚠️Allerdings werden diese Werte ggf. zur Laufzeit durch konfigurative Vorgaben überschrieben (siehe nächster Abschnitt) und lauten dann wie folgt:⚠️
Standard-Datenzugriffe: 120 Sekunden
Standard Erweitertes Timeout: 1200 Sekunden
Sage Vorgaben konfigurieren
Grundsätzlich werden die Default-Timeouts in der jeweiligen Device-Klasse des Datenzugriffsmodells der Sage 100 hart codiert vorbelegt ("Sagede.OfficeLine.Data.Devices.MainDevice").
⚠️Es erfolgt jedoch ein Auslesen und Überschreiben dieser Werte anhand von Konfigurationsdaten mit der Funktion "Sagede.OfficeLine.Data.Configuration.DataConfigProvider.GetConnectionSettings()" ⚠️
Siehe nächster Abschnitt.
Diese Funktion wird von Sage jedes Mal dann aufgerufen, sobald die einzelnen Datenbereiche, z.B. "MainDevice", im Sage 100 Objektmodell von Sage erzeugt werden. Aus Performance-Gründen erfolgt diese Neuintialisierung der Devices so selten wie irgendwie möglich.
Vorgabe in Office Line.config-Datei
Diese Informationen werden ganz konkret aus der Sage Konfiguration der jeweiligen Maschine vorbelegt, die den Datenkontext auslöst.
Diese Konfiguration wird standardmäßig in der folgenden XML-Konfigurationsdatei auf der jeweiligen Maschine verwaltet und können dort auch angepasst werden.
%ProgramData%\Sage\Office Line\9.0\Office Line.Config
Vorgabe/Überschreiben in .net Code
Eine andere Alternative ist, dass entwicklungsseitig die Default-Werte zur Laufzeit per Quellcode überschrieben werden.
Nachfolgendes Code-Beispiel demonstriert diese Vorgehensweise.
var mandatorMainDeviceTimeoutOriginal = mandator.MainDevice.GenericConnection.ConnectionSettings.DefaultTimeout;
var mandatorMainDeviceTimeoutEnhancedOriginal = mandator.MainDevice.GenericConnection.ConnectionSettings.EnhancedTimeout;
// Change the current timeout settings
mandator.MainDevice.GenericConnection.ConnectionSettings.DefaultTimeout = 450;
mandator.MainDevice.GenericConnection.ConnectionSettings.EnhancedTimeout = 2000;
var command = mandator.MainDevice.GenericConnection.CreateSqlStringCommand( "SELECT [Artikelnummer] FROM KHKArtikel WITH(Readuncommitted) WHERE [Mandant] = @mandantID ORDER BY [Artikelnummer] " );
command.AppendInParameter( "mandantID" , typeof( short ) , 123 );
command.UseEnhancedTimeout = true;
using ( var dataLoader = command.ExecuteReader() )
{
if ( dataLoader.HasRows )
{
while ( dataLoader.Read() )
{
System.Diagnostics.Debug.WriteLine( dataLoader[0] );
}
}
}
// Note: Consider putting the following code in try...finally
mandator.MainDevice.GenericConnection.ConnectionSettings.DefaultTimeout = mandatorMainDeviceTimeoutOriginal;
mandator.MainDevice.GenericConnection.ConnectionSettings.EnhancedTimeout = mandatorMainDeviceTimeoutEnhancedOriginal;
Generelle Anmerkung zu Timeouts
Das Erhöhen von SQL-Timeouts bzw. Timeouts sollte generell der letzte "Ausweg" sein. Die Standard Timeouts von Sage sind schon recht großzügig bemessen.
In der Praxis kann es jedoch bei sehr großen Datenbanken, z.B. bei Datenexporten, zur sehr langen SQL-Ausführungszeiten kommen, die durchaus nicht weiter optimierbar sind.
In solchen Fällen kann ein Hochsetzen des Timeouts durchaus kontextbezogen sinnvoll sein.