Folgendes Beispiel zeigt, wie sich der Datenimport im Client/Server-Betrieb enorm beschleunigen lässt. Mit der Projektmethode Regulärer Import können Sie testen, wie lange es dauert, mit dem Befehl IMPORT TEXT Datensätze auf der Arbeitsstation zu importieren:
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
INPUT FORM([Table1];"Import")
$vhStartTime:=Current time
IMPORT TEXT([Table1];Document)
$vhEndTime:=Current time
ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
End if
Mit dieser Methode analysiert 4D die Textdatei, erstellt dann für jeden Datensatz einen neuen Datensatz, füllt die Datenfelder mit den importierten Daten und sendet den Datensatz zum Server-Rechner, damit er der Datenbank hinzugefügt wird. Demzufolge laufen viele Anfragen über das Netzwerk. Diese Operation lässt sich mit einer Serverprozedur optimieren, da sie dann lokal auf dem Server-Rechner ausgeführt wird. Der Client-Rechner lädt das Dokument in ein BLOB, startet dann eine Serverprozedur, die das BLOB als Parameter übergibt. Die Serverprozedur speichert das BLOB in einem Dokument auf der Festplatte des Server-Rechners und importiert dann das Dokument lokal. Der Datenimport wird demnach lokal ausgeführt (mit einer Geschwindigkeit, die mit 4D im lokalen Modus vergleichbar ist), da die meisten Anfragen über das Netzwerk eliminiert wurden.
Es folgt die Projektmethode CLIENT IMPORT. Sie wird auf dem Client-Rechner ausgeführt und ruft die Serverprozedur SERVER IMPORT auf:
C_POINTER($1)
C_TEXT($2)
C_TIME($vhDocRef)
C_BLOB($vxData)
C_LONGINT(spErrCode)
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
$vhStartTime:=Current time
DOCUMENT TO BLOB(Document;$vxData)
If(OK=1)
$spProcessID:=Execute on server("SERVER IMPORT";32*1024;
"Server Import Services";Table($1);$2;$vxData)
CLEAR VARIABLE($vxData)
Repeat
DELAY PROCESS(Current process;300)
GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
If(Undefined(spErrCode))
spErrCode:=1
End if
Until(spErrCode<=0)
spErrCode:=1
SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
$vhEndTime:=Current time
ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
Else
ALERT("Es gibt nicht genügend Speicher, um das Dokument zu laden.")
End if
End if
Es folgt die Projektmethode SERVER IMPORT, ausgeführt als Serverprozedur:
C_LONGINT($1)
C_TEXT($2)
C_BLOB($3)
C_LONGINT(spErrCode)
spErrCode:=1
$vpTable:=Table($1)
INPUT FORM($vpTable->;$2)
$vsDocName:="Import File "+String(1+Random)
If(On Windows)
$vsDocName:=$vsDocName+".txt"
End if
DELETE DOCUMENT($vsDocName)
BLOB TO DOCUMENT($vsDocName;$3)
IMPORT TEXT($vpTable->;$vsDocName)
DELETE DOCUMENT($vsDocName)
spErrCode:=0
Repeat
DELAY PROCESS(Current process;1)
Until(spErrCode>0)
Hinweis: Die Projektmethode On Windows finden Sie im Handbuch 4D Programmiersprache im Abschnitt Einführung in Systemdokumente.
Sind diese beiden Projektmethoden in einer Datenbank integriert, können Sie den Import über eine Serverprozedur ausführen, wenn Sie beispielsweise schreiben:
CLIENT IMPORT(->[Table1];"Import")
Bei einigen Benchmarks werden Sie feststellen, dass der Import von Datensätzen mit dieser Methode bis zu 60 mal schneller läuft als über den regulären Import.