DBGetDataModuleFromPool()
DBGetDataModuleFromPool() – DatenModul anfordern
Die Funktion liefert ein DatenModul-Objekt (TBeDbGet) aus dem DatenModul-Pool und stellt die Laufzeit-optimierte Variante zu CreateObject('TBeDBGet') dar. Das DatenModul-Objekt bleibt solange für den Aufrufer reserviert, bis es mit DBReturnDataModuleToPool() freigegeben wird. Weitere Aufrufe von DBGetDataModuleFromPool() vor DBReturnDataModuleToPool() liefern oder erzeugen zusätzliche DatenModul-Objekte.
Im be Client ist der Einsatz des DatenModul-Pools besonders dann sinnvoll, wenn ein Datenmodul innerhalb einer Sitzung bisher immer wieder angelegt und anschließend wieder zerstört wird.
Für häufig verwendete Kombinationen von Tabellen kann durch Angabe eines selbst gewählten Alias ein separater Typ von DatenModulen angelegt werden. Wird ein DatenModul mit diesem Alias aus dem Pool angefordert, dann wird ein DatenModul geliefert, bei dem die gewünschten Tabellen bereits geöffnet sind, was einen erheblichen Laufzeitgewinn bedeutet. Dies wird erreicht durch die Wiederverwendung von DatenModul-Objekten, die wieder zurückgegeben wurden.
Bei Verwendung des DatenModul-Pools auf dem beas mit eigenen Aliasen ist der Laufzeitgewinn gegen die Resourcenbelegung abzuwägen, da pro User / Abteilung / Standort-Kombination, für die ein Request bearbeitet wird, ein neues DatenModul angelegt wird und bis zur Beendigung dieser beas Instanz erhalten bleibt. Die ADS Connection, die für dieses DatenModul angelegt wird, bleibt ebenfalls reserviert. Um die Resourcenbelegung abzuschätzen ist dies noch mit der Anzahl der vergebenen Aliase zu multiplizieren.
Hinweise
DatenModul-Objekte, die mit DBReturnDataModuleToPool() erzeugt wurden, dürfen NIE über DestroyObject() gelöscht werden. Sie müssen unbedingt mit DBReturnDataModuleToPool() zurückgegeben werden.
Events werden nach DBReturnDataModuleToPool() nicht mehr ausgeführt.
Die Verwendung von Objektvariablen nach DBReturnDataModuleToPool() ist nicht mehr zulässig und kann zu falschen Ergebnissen führen.
Vor Rückgabe eines DatenModul-Objekts an den Pool muss die Transaktion beendet werden.
Eine Änderung der Objekteigenschaften ist zwar möglich, muss jedoch vor DBReturnDataModuleToPool() rückgängig gemacht werden!
Events, Indices, Scopes, Ranges und Filter dürfen zwar auf den benutzten Tabellen zugewiesen bleiben, werden aber automatisch entfernt.
Es muss durch Fehlerauffangroutinen sichergestellt werden, dass für jeden DBGetDataModuleFromPool()-Befehl ein zugehöriger DBReturnDataModuleToPool()-Befehl ausgeführt wird!
Parameter | Beschreibung |
---|---|
cAliasName:C | Alias; Ist der Parameter nicht vorhanden oder leer, wird intern '*' als Default verwendet. |
Rückgabewert
Objekt - DatenModul (TBeDbGet)
Beispiel
// Performance-Vergleich DBGetDataModuleFromPool() / CreateObject('TBeDBGet')
| aDab010, i, aTime, aCount, aBeOpenTime, aOpenTime, oBeDBGet|
aCount := 5,
aTime := GetExTimer(),
for i := 1 to aCount do
oBeDBGet := DBGetDataModuleFromPool(),
aDab010 := DBGetTable(oBeDBGet, waDab010),
// aDab010 := BeOpen(waDAB010),
startseq,
DbGoTop(aDab010),
Writeln(aDab010:ArtNr)
always,
DBReturnDataModuleToPool(oBeDBGet),
stopseq,
next,
aBeOpenTime := Str(GetExTimer() - aTime),
aTime := GetExTimer(),
for i := 1 to aCount do
oBeDBGet := CreateObject('TBeDBGet'),
aDab010 := DBGetTable(oBeDBGet, waDab010),
//aDab010 := DBOpen(waDAB010),
startseq,
DbGoTop(aDab010),
Writeln(aDab010:ArtNr)
always,
DestroyObject(oBeDBGet)
stopseq,
next,
aOpenTime := Str(GetExTimer() - aTime),
WriteLn(Replicate('=', 2*aCount) + crlf +
'Tabelle DAB010 ' + Str(aCount) + ' Mal öffnen:' + crlf +
'aus Cache: ' + Chr(9) + aBeOpenTime + crlf +
'konventionell: ' + Chr(9) + aOpenTime + crlf +
Replicate('=', 2*aCount)),