SPベースの読み込み (例題)

4D - Documentation   French   English   German   日本語   4D Serverテーマリスト   4D Serverインデックス   戻る   前   次

version 6.0.2


次の例は、クライアント/サーバアーキテクチャにおいて、データの読み込みを飛躍的に高速化する方法を示しています。Regular Importメソッドでは、クライアント側でIMPORT TEXTコマンドを使用して、レコードの読み込みに要する時間を調べています:

      ` Regular 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("It took "+String(0+($vhEndTime-$vhStartTime))+" seconds.")
   End if 

通常のデータ読み込みでは、4Dはテキストファイルを解析した後、各レコードに対して新しいレコードを作成し、読み込んだデータをフィールドに入力し、レコードをサーバマシンに送信してデータベースに追加します。そのため、大量の要求がネットワーク上でやり取りされることになります。この操作を最適化する方法の1 つとして、ストアドプロシージャを使用し、サーバマシンでローカルにこの作業を実行するやり方があります。クライアントマシンではドキュメントファイルをBLOB にロードした後、ストアドプロシージャを開始し、引数としてこのBLOB を渡します。ストアドプロシージャではこのBLOB をサーバマシンのディスク内のドキュメントファイルに保存し、このドキュメントファイルをローカルに読み込みます。ネットワーク要求がほとんどなくなるため、データ読み込みはローカルに (ローカルバージョンの4Dと比較可能な速度で) 処理されます。

次に示すのは、CLIENT IMPORTプロジェクトメソッドです。このプロジェクトメソッドはクライアントマシンで実行され、後述のSERVER IMPORTストアドプロシージャを呼び出します:

      ` CLIENT IMPORT Project Method
      ` CLIENT IMPORT ( Pointer ; Text)
      ` CLIENT IMPORT ( -> [Table] ; Input form )

   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)
            ` ドキュメントをBLOBに読み込めたら
            ` ストアドプロシージャを開始し、サーバマシン上でデータを読み込む
         $spProcessID:=Execute on server("SERVER IMPORT";32*1024;
                              "Server Import Services";Table($1);$2;$vxData)
            ` この時点で、このプロセス内でこのBLOBはもう必要ない
         CLEAR VARIABLE($vxData)
            ` ストアドプロシージャの処理終了を待つ
         Repeat 
            DELAY PROCESS(Current process;300)
            GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
            If (Undefined(spErrCode))
                  ` Note: ストアドプロシージャが自身のspErrCode変数のインスタンスをまだ初期化しいない場合、
                  ` 未定義変数が返されるかもしれません。 
               spErrCode:=1
            End if 
         Until (spErrCode<=0)
            ` ストアドプロシージャに結果を取得したことを伝える  
         spErrCode:=1
         SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
         $vhEndTime:=Current time
         ALERT("It took "+String(0+($vhEndTime-$vhStartTime))+" seconds.")
      Else 
         ALERT("There is not enough memory to load the document.")
      End if 
   End if 

以下はストアドプロシージャとして実行されるSERVER IMPORTプロジェクトメソッドです:

      ` SERVER IMPORT Project Method
      ` SERVER IMPORT (Long ; Text; BLOB )
      ` SERVER IMPORT (Table number ; Input form ; Import Data )

   C_LONGINT($1)
   C_TEXT($2)
   C_BLOB($3)
   C_LONGINT(spErrCode)

      ` 処理がまだ終わっいない, spErrCodeを1に設定
   spErrCode:=1
   $vpTable:=Table($1)
   INPUT FORM($vpTable->;$2)
   $vsDocName:="Import File "+String(1+Random)+".txt"
   DELETE DOCUMENT($vsDocName)
   BLOB TO DOCUMENT($vsDocName;$3)
   IMPORT TEXT($vpTable->;$vsDocName)
   DELETE DOCUMENT($vsDocName)
      ` 処理が終了した, spErrCodeを0に設定
   spErrCode:=0
      ` リクエストもとのクライアントからの通知を待つ
   Repeat 
      DELAY PROCESS(Current process;1)
   Until (spErrCode>0)

これら2 つのプロジェクトメソッドがデータベースに実装された後で、例えば次のように、“ストアドプロシージャベース”のデータ読み込みを実行できます:

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

ベンチマークテストを何度か行うと、このメソッドを使用した場合には、通常のデータ読み込みの場合と比べて最高で60倍も速くレコードを読み込めることがわかります。

参照

Execute on server, GET PROCESS VARIABLE, SET PROCESS VARIABLE, SPベースのサービス (例題), ストアドプロシージャ.


4D - Documentation   French   English   German   日本語   4D Serverテーマリスト   4D Serverインデックス   戻る   前   次