Execute on server

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 2004.3 (Modified)


Execute on server (procedure; stack{; name{; param{; param2; ...; paramN}{; *}}}) 数値

引数説明
procedure文字列プロセス中で実行するメソッド
stack数値スタックサイズ (バイト)
name文字列作成するプロセスの名前
paramメソッドの引数
*重複しないプロセス
戻り値数値新規プロセスのプロセス番号
または既存のプロセス番号

説明

Execute on server コマンドはサーバマシン上 (クライアント/サーバで実行された場合) 、または同じマシン上 (シングルユーザで実行された場合) で新しいプロセスを開始し、そのプロセスのプロセス番号を返します。

Execute on serverコマンドを使用してストアドプロシージャを開始します。ストアドプロシージャについての詳細は4D Server Referenceマニュアルのストアードプロシージャの節を参照してください。

クライアントマシンでExecute on serverを実行した場合、負のプロセス番号が返されます。サーバマシンでExecute on serverを実行すると、正のプロセス参照番号が返されます。サーバマシン上でNew processコマンドを実行することは、Execute on serverを実行することと同じです。

プロセスが作成できない場合 (例えばメモリ不足) 、Execute on serverは0を返し、エラーが発生します。このエラーはON ERR CALLでインストールしたエラー処理メソッドを使用してとらえることができます。

プロセスメソッド: methodには、新しいプロセスのプロセスメソッド名を指定します。4Dは新規プロセスのコンテキストを設定した後、このメソッドの実行を開始します。したがって、これがプロセスメソッドになります。

プロセススタック: stackには、プロセスのスタックに割り当てるメモリの量を指定します。このメモリ領域にメソッド呼び出し、ローカル変数、サブルーチンの引数、スタックしたレコード等が“積み上げ”られてゆきます。この大きさはバイトで表され、少なくとも64K (約64,000バイト) を渡します。しかし、プロセスでサイズの大きいコールを続けて実行する場合等は (サブルーチンからサブルーチンを呼び出す等) 、これ以上の値を渡すこともできます。例えば、必要なら200K (約200,000バイト) を渡すこともできます。

Note: スタックはプロセスの合計メモリではありません。各プロセスはレコードやインタープロセス変数等のためにメモリを共有します。またプロセスはプロセス変数の保持にメモリを余計に使用します。スタックはローカル変数やメソッドコール、サブルーチンの引数、スタックされたレコードを維持するだけです。

プロセス名: nameには新しいプロセスの名前を指定します。シングルユーザモードでは、ここで指定した名前が短タイムエクスプローラのプロセスリストに表示され、この新しいプロセスに対してPROCESS PROPERTIESコマンドを実行するとこの名前が返されます。クライアント/サーバモードでは、4D Serverのメインウインドウのストアドプロシージャリストに青字で表示されます。

プロセス名は最大31文字まで指定することができます。この引数は省略することができます。省略した場合、プロセス名は空の文字列になります。

警告: New Processとは異なり、Execute on serverコマンドの実行時に、プロセス名の先頭にドル記号 ($) 記号を付けて、プロセスをローカルにしようとはしないでください。シングルユーザモードではExecute on serverコマンドはNew Processコマンドと同じ処理を実行するため、プロセスをローカルにしても正常に動作します。しかし、クライアント/サーバモードではエラーが発生します。

プロセスメソッドの引数: バージョン6より、プロセスメソッドに引数を渡せるようになりました。サブルーチンにパラメータを渡すのと同じ要領でプロセスメソッドに引数を渡します。しかし制約があります。ポインタ表現は渡すことができません。また、メソッドに対して配列を引数として受け渡すことができない点にも留意してください。プロセスメソッドは、新規プロセスのコンテキスト内で実行を開始する際に、$1, $2等に引数の値を受け取ります。

Note: プロセスメソッドに引数を渡す場合、必ずname引数を指定しなければなりません。この場合、この引数は省略できません。

オプションの * 引数: この最後の引数を指定した場合、4Dははじめにnameに指定した名前を持つプロセスが既に実行されているかどうかを調べます。同一名のプロセスが存在する場合、4Dは新規プロセスを開始せずにその名前を持つプロセスのプロセス番号を返します。

例題

以下の例は、クライアント/サーバにおいてデータ読み込みの処理速度を飛躍的に向上する方法を示しています。以下のRegular Importメソッドにより、クライアント側でIMPORT TEXTコマンドを使用したレコード読み込みに要する時間を調べることができます:

      ` Regular Import Project Method
   $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 Clientがテキストファイルの解析を行った後、各レコードごとに新規レコードを作成し、読み込んだデータをフィールドに格納して、データベースに追加するためにレコードをサーバマシンに送信します。この結果、ネットワーク上には大量のリクエストが行きかいます。この処理を最適化するには、ストアドプロシージャを利用し、サーバマシン上でローカルにジョブを実行します。クライアントマシンではドキュメントファイルをBLOBにロードし、引数にこのBLOBを渡してストアドプロシージャを開始します。ストアドプロシージャはこのドキュメントファイルをサーバマシンに保存し、ドキュメントをローカルに読み込みます。したがって、ネットワークリクエストの大部分が必要なくなるため、データ読み込みはシングルユーザ版並の速度でローカルに実行されます。次にCLIENT IMPORTプロジェクトメソッドを示します。このメソッドはクライアントマシン上で実行され、後のSERVER IMPORTストアドプロシジャを開始します。

      ` CLIENT IMPORT プロジェクトメソッド
      ` CLIENT IMPORT ( ポインタ; 文字列 )
      ` CLIENT IMPORT ( -> [table] ; Input form )

   C_POINTER($1)
   C_STRING(31;$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 プロジェクトメソッド
      ` SERVER IMPORT ( 倍長整数; 文字列 ; BLOB )
      ` SERVER IMPORT ( ーブル番号 ; 入力フォーム ; Iデータの入力 )

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

      ` Operation is not finished yet, set spErrCode to 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 is finished, set spErrCode to 0
   spErrCode:=0
      ` Wait until the requester Client got the result back
   Repeat 
      DELAY PROCESS(Current process;1)
   Until (spErrCode>0)

データベースにこの2つのプロジェクトメソッドを作成したら、例えば以下のようにストアドプロシージャベースのデータ読み込みを実行できます:

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

ベンチマークテストによると、このメソッドを使用してレコード読み込みを実行すると通常の読み込みよりも60倍高速に処理されました。

参照

New process, ストアドプロシージャ.


4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次