4D v16

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

ホーム

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

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


 

 

次の例は、クライアント/サーバアーキテクチャにおいて、データの読み込みを飛躍的に高速化する方法を示しています。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)

Note: On Windows プロジェクトメソッドは4D Language ReferenceマニュアルのC_TEXTシステムドキュメントで紹介しています。

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

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

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



参照 

SPベースのサービス (例題)
ストアドプロシージャ

 
プロパティ 

プロダクト: 4D
テーマ: 4D Serverと4Dランゲージ

 
履歴 

 
ARTICLE USAGE

4D Server ( 4D v16)