Die hier beschriebenen Änderungen sind für eine vollständige technische Dokumentation der Aufgabe gedacht, und für dien Anwendungsentwickler nur teilweise relevant.
Die Tabelle CLAS wurde um eine Klasse REF - Schlüsseltabelle ergänzt. Siehe dazu MDB Änderung 1. Schlüsseltabellendefinitionen können in der MDB als generierbare Ressourcen markiert werden. Wenn dieser Bausteintyp als solches markiert ist, erscheinen die Schlüsseltabellendefinitionen in TaaGen als generierbare Ressourcen, und ist außerdem die Möglichkeit, sämtliche solche Bausteine zu generieren, aktiviert.
Der TAA Ressourcenviewer wurde um die Anzeige von Schlüsseltabellendefinitionen erweitert.
Über einen neuen InterfEdge-Befehl DSTRIMP können Schlüsseltabellendefinitionen sowie deren Inhalte (für Inhalte siehe die dazu gehörende MDB-Änderung) von Rochade gezielt in das EDB-Schattenverzeichnis exportiert werden. Bisher passierte dies als Nebeneffekt bestimmter Bearbeitungsoptionen von RefEdge. Mit diesem Feature lassen sich die Rochadedaten und das Schattenverzeichnis im Rahmen vom Konfigurationsmanagement kontrollierter verwalten.
Die Schlüsseltabellenzugriffsroutinen laufen in Abstimmung mit dem neuen Connecthandler um einen reibungslosen Einsatz der Schlüsseltabellenzugriffe unter sämtlichen Umgebungsbedingungen sicherzustellen. Der Connecthandler wurde ergänzt um notwendige Möglichkeiten für ReadOnly-Zugriffe auf einer MS-Access Datenbank. Die Schlüsseltabellendatenbank läßt sich vollständig, auch ohne vorregistrierte ODBC-Datenquelle, in der TAA Datenbank Konfiguration registrieren.
Die Klassen für Datenstruktur- und Datenelementdefinitionen wurden um folgende schlüsseltabellenspezifischen Eigenschaften erweitert:
Schlüsseltabellen können keine subscripted und redefined Datenelemente beinhalten. Diese Überprüfung wurde an den bestehenden Routinen hinzugefügt.
Der Objectmanager (taaOmObj) ist in der Lage, Objekte der Klasse REF zu deklarieren. Für solche Objekte wird ein Objekttyp (OBJT) simuliert, die Datenstruktur wird aus der Schlüsseltabellendefinition geladen.
Die feldweisen Zugriffsroutinen des Objektmanagers wurden um Routinen zur effizienten Übertragung von SQL C Datentypen in den COBOL-basierten Datenbereichen der TAA Objekten (PutFldSqlType), sowie um Routinen zur effizienten Übertragung von COBOL-basierten Datenbereichen der TAA Objekten in den SQL C Datentypen (GetFldSqlType) restrukturiert und ergänzt.
Die Schlüsseltabellenzugriffsroutinen (taaRefDB) unterstützen eine neue Methode (ObjCompleteRef) eine Schlüsseltabelle vollständig in ein Datenobjekt zu übertragen oder wahlweise die vorhandenen unvollständigen Angaben im Datenobjekt zu ergänzen um Inhalte der Schlüsseltabelle. Dazu werden die Key-Felder im Datenobjekt ausgewertet und als Suchkriterien für den Tabellenzugriff genutzt. Die Ergebnismenge kann, bei unvollständigen oder nicht eindeutigen Schlüsseln, größer sein als die Ausgangsmenge.
Der Objectmanager (taaOmObj) bietet eine neue Methode (CompleteRef), um ein (Mengen)objekt der Klasse REF mit Daten aus einer Schlüsseltabelle zu ergänzen, oder die Schlüsseltabelle vollständig zu laden.
Die TAA ISAPI-Extension kennt einen Befehl tref zum Laden einer gesamten Schlüsseltabelle in XML-Format.
Die TAA ISAPI-Extension kann Dateien simulieren, die on-the-fly erstellt werden, oder aus serverseitig gespeicherten Zwischenergebnissen stammen. So kann das Laden einer Schlüsseltabelle (bspw. SGT aus der Anwendung VO) mit folgender URL geladen werden: http://<www.domain.de>/<pathspec>/vo/sgt.trf. Ob die Daten tatsächlich aus der Schlüsseltabelle geladen werden, oder aus einer früheren serverseitig gespeicherten Abfrage geliefert werden, kann dynamisch entschieden werden (noch nicht implementiert).
Die TAA ISAPI-Extension unterstützt clientseitiges Caching für HTTP/1.0 und HTTP/1.1 über die HTTP-Header Pragma, Expires, Cache-Control/max-age, If-Modified-Since, Last-Modified und Date.
Der Befehl dstr der TAA ISAPI-Extensionunterstützt jetzt auch die Lieferung von Definitionen für Schlüsseltabellen.
Datenstrukturen, Objekttypstrukturen und Schlüsseltabellendefinitionen können auch als virtuelle Datei durch die TAA ISAPI-Extension geliefert werden. Der benutzte Suffix ist dst für Datenstrukturen, ost für Objekttypstrukturen und stb für Schlüsseltabellendefinitionen. Die letzten beiden Komponenten der Pfadangabe werden als Anwendung und Name benutzt, bspw. zum Laden der Schlüsseltabellendefinition für die Tabelle SGT aus der Anwendung VO kann folgende URL benutzt werden:http://<www.domain.de>/<pathspec>/vo/sgt.stb. Auch hierzu wird clientseitiges Caching für HTTP/1.0 und HTTP/1.1 unterstützt. Die Alterung der Ergebnisdaten können über die Registry (Config\MaxAgeDstr) gesteuert werden. Die Standardvorgabe beträgt zwölf Stunden. Die Vorgabe wird in Minuten gemacht. Eine explizite Vorgabe von 0 (Null) bedeutet, dass kein clientseitiges Caching angewandt werden darf.
Die TAA-Infrastruktur kann die Aufrufe von Schlüsseltabellenzugriffsmodulen simulieren und selbst die entsprechenden Zugriffe durchführen. Dafür müssen folgende Voraussetzungen erfüllt sein:
Das Verhalten der bisher eingesetzten COBOL-Zugriffsmodule wird möglichst genau simuliert; der Inhalt des Parameterobjekts ist nach dem Zugriff gleich. Einzige Einschränkung: Es dürfen beim Zugriff über ExecuteInternal nicht zwei Zugriffstypen gemischt werden, d.h. es können nicht in einem Modulaufruf sowohl die gesamte Tabelle als auch einzelne Sätze aus der Tabelle gelesen werden.
Zur Optimierung des Laufzeitverhaltens kann die TAA-Infrastruktur Schlüsseltabellenzugriffe cachen, und zwar sowohl Zugriffe auf Einzelsätze als auch ganze Tabellen. Um dieses Feature zu aktivieren, muss in der TAA Datenbank Konfiguration für die Datenbank, die die Schlüsseltabellen enthält, der Eintrag Caching = 1 gesetzt sein (s. auch hier). Ausnahme: Wenn für einen Zugriff mit Schlüssel mehr als 1 Satz als Ergebnis geliefert wird, werden diese nicht gecacht.
Der COBOL-Preprozessor unterstützt die Anweisung EXEC TAA COMPLETEREF für das Lesen des Inhalts einer Schlüsseltabelle (ohne simulierten Modulaufruf, s. unten), entsprechend der oben beschriebenen Methode objCompleteRef. Die Angaben Caching oder LoadStbcFromRes in der dbConfig-Section der Registry sind auch hierbei wirksam. Eine Beschreibung der genauen Syntax finden Sie in der COBOL-Hilfe.
In COBOL werden Modulaufrufe, die folgende Voraussetzungen erfüllen, als Schlüsseltabellen-Zugriffe intern ausgeführt:
Trifft eine dieser Voraussetzungen nicht zu, wird wie gehabt das in der Ispc angegebene Modul aufgerufen. Zur Kontrolle wird bei intern ausgeführten Modulen im TAA-Monitor eine Meldung vom Typ „Architecture Trace“ ausgegeben.
Wenn in der dbConfig-Section für die Referenzdatenbank zusätzlich der Wert Caching=1 gesetzt wird, werden einmal gelesene Schlüsseltabellen und Einzelsätze aus Schlüsseltabellen intern gespeichert, um mehrfache physische Zugriffe auf dieselbe Tabelle/denselben Satz zu vermeiden.
Um Laufzeitvergleiche durchzuführen, kann auf die BstnTime-Ausgaben im TAA-Monitor zurückgegriffen werden.
Eine Alternative zur Optimierung des Laufzeitverhaltens ist das Laden von Schlüsseltabelleninhalten aus einer Ressourcen-DLL. Dafür sind folgende Maßnahmen erforderlich:
Wenn eine Schlüsseltabelle in der Ressourcen-DLL nicht gefunden wird, versucht das Laufzeitsystem, diese Tabelle trotzdem aus der konfigurierten Datenbank zu laden. Dieses Verhalten können Sie über die Einstellung LoadStbcFromResOnly = 1 verhindern, es erfolgt dann kein Zugriff auf die Datenbank mehr.
INSERT INTO edbBstn ( Name, Bezeichnung, Suffix, Präfix, Zielsystem, Baustein_Kategorie, Parent, EdbInt, Path, AltPath, Header_Record, Anzahl_Felder, Table_Mode, ListFor, Flags, Interface_Version, Version, Aufrufbar, ExtName, AltExtName ) SELECT 'STBC', 'Schlüsseltabelleninhalt', 'CSV', 'T$F', 'CSV', 0, 'OUTP', 132, '$E\$V\$S;K:\SRC\$(*)V\EDB\$S/r', '$E\$V\$S;K:\SRC\$(*)V\EDB\$S/r', 0, 0, 0, '', 0, 0, 0, 0, '', '';
Dieser Eintrag wird durch nachfolgende MDB-Änderungen noch angepasst.
insert into edbClas values ("REF", "Schlüsseltabelle")
update edbbstn set flags = flags | 16 where edbint = 120
Folgende Änderungen sind in der MDB notwendig, um Schlüsseltabelleninhalte (STBC) in eine Ressourcen-DLL generieren zu können:
UPDATE edbBstn SET edbBstn.[ListBy] = 'LSTC' WHERE (((edbBstn.Name)='STBC')); UPDATE edbBstn SET edbBstn.[Flags] =flags | 16 WHERE (((edbBstn.Name)='STBC')); UPDATE edbBstn SET edbBstn.[Präfix] = 'T$F' WHERE (((edbBstn.Name)='STBC')); INSERT INTO edbBstn ( Name, Bezeichnung, Suffix, Baustein_Kategorie, Parent, EdbInt, Path, Header_Record, Anzahl_Felder, Table_Mode, ListFor, Flags, Interface_Version, Version, Aufrufbar ) SELECT 'LSTC' , 'Schlüsseltabelleninhaltsliste' , 'CSV' , 2 , 'SLST' , 133 , '$E\$V\$S;K:\SRC\$(*)V\EDB\$S/r' , 1 , 5 , 2 , 'STBC', 0, 0, 0,
INSERT INTO edbBstn ( Name, Bezeichnung, Suffix, Baustein_Kategorie, Parent, EdbInt, Path, Header_Record, Anzahl_Felder, Table_Mode, ListFor, Flags, Interface_Version, Version, Aufrufbar ) SELECT 'STBO', 'Schlüsseltabelleninhalt für simulierte Datenzugriffe', '', 0, 'STBC', 134, '', 0, 0, 0, '', 0, 0, 0, 0;
[HKEY_LOCAL_MACHINE\SOFTWARE\TAA\DbConfig\RefDB] "PhysicalName"="" "ConnectionStringExtra"="Driver={Microsoft Access Driver (*.mdb)};FIL=MS Access;MaxBufferSize=512;MaxScanRows=1;ReadOnly=1;DBQ=g:\\400\\dalref.mdb" "ExecuteInternal"=hex:01 "Caching"=hex:01 "LoadStbcFromRes"=hex:01 "LoadStbcFromResOnly" = hex:00
–> Weitere Informationen zur DbConfig.
(Arbeitsstand 08.09.2000) Fall A: Client mit Pentium II 450, 256MB RAM, sämtliche Schlüsseltabellen in MS-Access Datenbank (5,4MB) auf Fileserver mit 100MBit Netz. Benutzte Schlüsseltabelle TVOSGT (Gevo-Typ-Tabelle).
Durchschnittliche Zeit zum Laden zwei ausgewählter Einträge (auf Basis Schlüsselvorbelegung im Mengenobjekt): zwischen 50 und 60 Millisekunden.
Durchschnittliche Zeit zum Laden der gesamten Schlüsseltabelle (332 Sätze - tvosgt) in einem Mengenobjekt: zwischen 90 und 110 Millisekunden.
(Arbeitsstand 11.09.2000)
Zeiten bei Zugriff auf einem einzigen Element einer Schlüsseltabelle:
Client Waiting | Srv: Gesamt | Srv: DB-Zugriff | Srv: XML-Fmt | |
---|---|---|---|---|
123,091ms | 36,379m | 15,223ms | 0,675ms | |
86,581ms | 35,590ms | 15,580ms | 0,677ms | |
86,562ms | 36,265ms | 15,175ms | 1,152ms | |
103,803ms | 38,294ms | 16,971ms | 0,777ms | |
56,183ms | 24,821ms | 15,691ms | 0,850ms | |
60,532ms | 28,021ms | 17,041ms | 0,745ms | |
54,503ms | 24,548ms | 15,301ms | 0,733ms | |
60,368ms | 27,138ms | 17,114ms | 0,860ms | |
55,476ms | 24,908ms | 15,729ms | 0,661ms | |
57,968ms | 25,337ms | 16,153ms | 0,735ms | |
Durchschnitt | 74,507ms | 30,130ms | 15,998ms | 0,787ms |
Zeiten bei Zugriff auf acht ausgewählte Elemente einer Schlüsseltabelle:
Client Waiting | Srv: Gesamt | Srv: DB-Zugriff | Srv: XML-Fmt | |
---|---|---|---|---|
174,945ms | 103,042ms | 83,688ms | ||
184,162ms | 110,381ms | 86,881ms | ||
179,647ms | 105,217ms | 84,219ms | ||
177,045ms | 102,736ms | 82,355ms | ||
171,969ms | 97,876ms | 79,685ms | ||
180,217ms | 104,202ms | 83,187ms | ||
231,192ms | 104,796ms | 84,813ms | ||
188,372ms | 107,733ms | 84,249ms | ||
183,669ms | 103,584ms | 83,152ms | ||
191,100ms | 106,681ms | 85,998ms | ||
Durchschnitt | 186,232ms | 104,625ms | 83,823ms | 6,289ms |
Zeiten bei unselektiertem Zugriff auf die gesamte Tabelle (332 Elemente), wobei die Ergebnisse nach dem ersten Zugriff aus dem lokalen Cache besorgt werden können, da kein Filter angewandt wurde:
Client Waiting | Srv: Gesamt | Srv: DB-Zugriff | Srv: XML-Fmt | |
---|---|---|---|---|
2.714,616ms | 534,332ms | 92,651ms | 431,663ms | |
1,115ms | 0,000ms | 0,000ms | 0,000ms | |
1,916ms | 0,000ms | 0,000ms | 0,000ms | |
1,142ms | 0,000ms | 0,000ms | 0,000ms | |
0,986ms | 0,000ms | 0,000ms | 0,000ms | |
1,009ms | 0,000ms | 0,000ms | 0,000ms | |
0,983ms | 0,000ms | 0,000ms | 0,000ms | |
1,004ms | 0,000ms | 0,000ms | 0,000ms | |
0,949ms | 0,000ms | 0,000ms | 0,000ms | |
0,991ms | 0,000ms | 0,000ms | 0,000ms | |
Durchschnitt | n/a | n/a | n/a | n/a |