Import mit Serverprozeduren (Beispiel)

4D - Documentation   Français   English   German   4D Server, Inhalt   Index   Back   Previous   Next

Version 6.0.2


Folgendes Beispiel zeigt, wie sich der Datenimport im Client/Server-Betrieb enorm beschleunigen lässt. Mit der Methode Reguläre Projektmethode Import können Sie testen, wie lange es dauert, mit dem Befehl IMPORT TEXT Datensätze auf der Arbeitsstation zu importieren:

      ` Reguläre Projektmethode Import
   $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 Client 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 der Geschwindigkeit für Einzelplatz), da die meisten Anfragen über das Netzwerk eliminiert wurden.

Hier ist die Projektmethode CLIENT IMPORT. Sie wird auf dem Client-Rechner ausgeführt und ruft die Serverprozedur SERVER IMPORT auf:

      ` Projektmethode CLIENT IMPORT
      ` CLIENT IMPORT ( Pointer ; String )
      ` CLIENT IMPORT ( -> [Table] ; Input form )

   C_POINTER($1)
   C_STRING(31;$2)
   C_TIME($vhDocRef)
   C_BLOB($vxData)
   C_LONGINT(spErrCode)

      ` Wähle das zu importierende Dokument
   $vhDocRef:=Open document("")
   If (OK=1)
         ` Wurde ein Dokument ausgewählt, schließe es
      CLOSE DOCUMENT($vhDocRef)
      $vhStartTime:=Current time
         ` Versuche, es in den Speicher zu laden
      DOCUMENT TO BLOB(Document;$vxData)
      If (OK=1)
            ` Konnte das Dokument in das BLOB geladen werden,
            ` Starte die Serverprozedur, die die Daten auf dem Server-Rechner importiert.
         $spProcessID:=Execute on server("SERVER IMPORT";32*1024;
                              "Server Import Services";Table($1);$2;$vxData)
            ` Wir benötigen das BLOB nicht länger in diesem Prozess
         CLEAR VARIABLE($vxData)
            ` Warte bis die Operation durch die Serverprozedur vollständig ausgeführt ist
         Repeat
            DELAY PROCESS(Current process;300)
            GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
            If (Undefined(spErrCode))
                  ` Hinweis: Hat die Serverprozedur nicht ihre eigene Instanz der Variablen spErrCode
                  ` initialisiert, wird evtl. eine undefinierte Variable zurückgegeben
               spErrCode:=1
            End if
         Until (spErrCode<=0)
            ` Teile derServerprozedur mit, dass wir bestätigen
         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

Hier ist die Projektmethode SERVER IMPORT, ausgeführt als Serverprozedur:

      ` Projektmethode SERVER IMPORT
      ` SERVER IMPORT (Long ; String ; BLOB)
      ` SERVER IMPORT (Table Number ; Input form ; Import Data)

   C_LONGINT($1)
   C_STRING(31;$2)
   C_BLOB($3)
   C_LONGINT(spErrCode)

      ` Operation ist noch nicht beendet, setze spErrCode auf 1.
   spErrCode:=1
   $vpTable:=Table($1)
   INPUT FORM($vpTable->;$2)
   $vsDocName:="Import File "+String(1+Random)
   DELETE DOCUMENT($vsDocName)
   BLOB TO DOCUMENT($vsDocName;$3)
   IMPORT TEXT($vpTable->;$vsDocName)
   DELETE DOCUMENT($vsDocName)
      ` Operation ist beendet, setze spErrCode auf 0.
   spErrCode:=0
      ` Warte, bis der anfragende Client das Ergebnis erhalten hat.
   Repeat
      DELAY PROCESS(Current process;1)
   Until (spErrCode>0)

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 Datensatzimport mit dieser Methode bis zu 60 mal schneller läuft als über den regulären Import.

Referenz

Execute on server, GET PROCESS VARIABLE, Serverprozeduren, Service mit Serverprozeduren (Beispiel), SET PROCESS VARIABLE.


4D - Documentation   Français   English   German   4D Server, Inhalt   Index   Back   Previous   Next