Import basé sur les procédures stockées (exemple)

4D - Documentation   Français   English   German   Manuel de référence de 4D Server, Sommaire   Manuel de référence de 4D Server, Index   Retour   Précédent   Suivant

version 6.0.2


L'exemple suivant démontre comment l'import de données peut être accéléré de manière spectaculaire en environnement client/serveur. La méthode Import classique listée ci-dessous vous permet de mesurer combien de temps prend un import d'enregistrements basé sur la commande LECTURE ASCII :

      ` Méthode projet Import classique
   $vhDocRef:=Ouvrir document("")
   Si (OK=1)
      FERMER DOCUMENT($vhDocRef)
      FORMULAIRE ENTREE([Table1];"Import")
      $vhStartTime:=Heure courante
      LECTURE ASCII([Table1];Document)
      $vhEndTime:=Heure courante
      ALERTE("L'opération a duré "+Chaine(0+($vhEndTime-$vhStartTime))+" secondes.")
   Fin de si 

Avec l'import de données classique, 4D Client analyse le fichier ASCII puis, pour chaque enregistrement, crée un nouvel enregistrement, remplit les champs avec les valeurs importées et envoie l'enregistrement au poste serveur afin qu'il soit ajouté à la base. Par conséquent, de nombreuses requêtes circulent sur le réseau. Afin d'optimiser l'opération, vous pouvez utiliser des procédures stockées pour effectuer l'import localement sur le poste serveur. Le poste client charge le document dans un BLOB et déclenche une procédure stockée en passant le BLOB comme paramètre. La procédure stockée place le BLOB dans un document sur le disque du poste serveur, puis importe le document en local. L'import des données est par conséquent effectué localement à une vitesse comparable à celle d'une version monoposte de 4D, car la plupart des requêtes transitant sur le réseau ont été éliminées. Voici la méthode projet CLIENT IMPORT. Lancée sur le poste client, elle déclenche l'exécution de la procédure stockée SERVER IMPORT, listée à la suite :

      ` Méthode projet CLIENT IMPORT
      ` CLIENT IMPORT ( Pointeur ; Alpha )
      ` CLIENT IMPORT ( -> [Table] ; Formulaire entrée )

   C_POINTEUR($1)
   C_ALPHA(31;$2)
   C_HEURE($vhDocRef)
   C_BLOB($vxData)
   C_ENTIER LONG(spErrCode)

      ` Sélectionnez le document à importer
   $vhDocRef:=Ouvrir document("")
   Si (OK=1)
         ` Si un document était sélectionné, ne pas le garder ouvert  
      FERMER DOCUMENT($vhDocRef)
      $vhStartTime:=Heure courante
         ` Essayons de le charger en mémoire
      DOCUMENT VERS BLOB(Document;$vxData)
      Si (OK=1)
            ` Si le document a pu être chargé dans le BLOB,
            ` Démarrer la procédure stockée qui va importer les données sur le poste serveur    
         $spProcessID:=Executer sur serveur("SERVER IMPORT";32*1024;
                              "Serveur Import Services";Table($1);$2;$vxData)
            ` Nous n'avons alors plus besoin du BLOB dans ce process
         EFFACER VARIABLE($vxData)
            ` Attendons l'achèvement de l'opération effectuée par la procédure stockée
         Repeter 
            ENDORMIR PROCESS(Numero du process courant;300)
            LIRE VARIABLE PROCESS($spProcessID;spErrCode;spErrCode)
            Si (Indefinie(spErrCode))
                  ` Note: si la procédure stockée n'a pas initialisé sa propre instance
                  ` de la variable spErrCode, il se peut qu'une variable indéfinie soit retournée 
               spErrCode:=1
            Fin de si 
         Jusque (spErrCode<=0)
            ` Envoyons un accusé de réception à la procédure stockée  
         spErrCode:=1
         ECRIRE VARIABLE PROCESS($spProcessID;spErrCode;spErrCode)
         $vhEndTime:=Heure courante
         ALERTE("L'opération a duré "+Chaine(0+($vhEndTime-$vhStartTime))+" secondes.")
      Sinon 
         ALERTE("Il n'y a pas assez de mémoire pour charger le document.")
      Fin de si 
   Fin de si 

Voici la méthode projet SERVER IMPORT exécutée en tant que procédure stockée :

      ` Méthode projet SERVER IMPORT
      ` SERVER IMPORT ( Entier long ; Alpha ; BLOB )
      ` SERVER IMPORT ( Numéro de table ; Formulaire entrée ; Données importées )

   C_ENTIER LONG($1)
   C_ALPHA(31;$2)
   C_BLOB($3)
   C_ENTIER LONG(spErrCode)

      ` L'opération n'est pas encore terminée, affectons 1 à spErrCode
   spErrCode:=1
   $vpTable:=Table($1)
   FORMULAIRE ENTREE($vpTable->;$2)
   $vsDocName:="Fichier Import "+Chaine(1+Hasard)
   Si(Sous Windows)
      $vsDocName:=$vsDocName+".txt"  ` Sous Windows, l'extension est obligatoire
   Fin de si
   SUPPRIMER DOCUMENT($vsDocName)
   BLOB VERS DOCUMENT($vsDocName;$3)
   LECTURE ASCII($vpTable->;$vsDocName)
   SUPPRIMER DOCUMENT($vsDocName)
      ` L'opération est terminée, affectons 0 à spErrCode
   spErrCode:=0
      ` Attendons que le poste client à l'origine de la requête ait reçu les résultats
   Repeter 
      ENDORMIR PROCESS(Numero du process courant;1)
   Jusque (spErrCode>0)

Note : La méthode projet Sous Windows est fournie dans la section Présentation des documents système du manuel Langage de 4D.

Une fois que ces deux méthodes projet ont été implémentées dans votre base, vous pouvez effectuer un import basé sur une procédure stockée, en écrivant par exemple :

   CLIENT IMPORT (->[Table1];"Import")

Si vous réalisez quelques tests comparatifs, vous pourrez constater qu'avec ce type de méthode, l'import des enregistrements est jusqu'à 60 fois plus rapide qu'un import "classique".

Référence

ECRIRE VARIABLE PROCESS, Executer sur serveur, LIRE VARIABLE PROCESS, Procédures stockées, Services basés sur les procédures stockées (exemple).


4D - Documentation   Français   English   German   Manuel de référence de 4D Server, Sommaire   Manuel de référence de 4D Server, Index   Retour   Précédent   Suivant