4D v16.3

Execute on server

ホーム

 
4D v16.3
Execute on server

Execute on server 


 

Execute on server ( procedure ; stack {; name {; param {; param2 ; ... ; paramN}}}{; *} ) -> 戻り値 
引数   説明
procedure  文字 in プロセス中で実行するメソッド
stack  倍長整数 in スタックサイズ (バイト)
name  文字 in 作成するプロセスの名前
param  in メソッドの引数
演算子 in 重複しないプロセス
戻り値  倍長整数 in 新規プロセスのプロセス番号 または既存のプロセス番号

説明   

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でインストールしたエラー処理メソッドを使用してとらえることができます。

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

stack 引数を使用すると、プロセスのスタックのために割り当てられたメモリ量を指定することができます。この空間が、メソッド呼び出し、ローカル変数、サブルーチンの変数、スタックされたレコードを”積み上げる”ためのメモリーです。

  • デフォルトのスタックサイズを使用するためにはstack に0を渡します。これはほとんどのアプリケーションに適しています(推奨設定)
  • 一 部の特定の場合において、カスタムの値を使用したい場合があるかもしれません。その際には値はバイト単位で指定しなければなりません。最小で64K (約64,000バイト)を渡す事ができ、プロセスが大掛かりなチェーン呼び出し(サブルーチンがまた他のサブルーチンを呼び出す、などと言った呼び出 し)を実行する場合には512KBを超える値を使用することもできます。

注: スタックはプロセスの合計メモリではありません。各プロセスはレコードやインタープロセス変数等のためにメモリを共有します。またプロセスはプロセス変数 の保持に追加のメモリを使用します。スタックには4Dの情報のさまざまな項目が格納されます。スタックに格納される情報の量は、ネストしたメソッドの呼び出し数、前のフォームが閉じられる前に開かれたフォームの数、ネストしたメソッドで使用されるローカル変数のサイズに基づきます。

64-bit 4D Serverについての注: 64-bit 4D Serverで実行されるプロセスのスタックは32-bit 4D Serverより多くのメモリー量を必要とします (大体2倍程度)。64-bit 4D Serverでコードが実行されることが予測される場合、この引数の値をチェックしてください。

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

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

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

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

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

param または戻り値に 4Dオブジェクト(C_OBJECT) を渡す場合、サーバーに対してはUTF-8のJSONフォームが使用されます。もし C_OBJECT オブジェクトにポインターが格納されている場合、そのポインターが参照している値が送られ、ポインターそのものは送られる訳ではないことに注意して下さい。

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

例題  

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

  ` Regular Import Project Method
 $vhDocRef:=Open document("")
 If(OK=1)
    CLOSE DOCUMENT($vhDocRef)
    FORM SET INPUT([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_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";0;
       "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_TEXT($2)
 C_BLOB($3)
 C_LONGINT(spErrCode)
 
  ` Operation is not finished yet, set spErrCode to 1
 spErrCode:=1
 $vpTable:=Table($1)
 FORM SET INPUT($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
テーマ: プロセス
番号: 373

 
履歴 

変更: 4D 2004.3

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v16)
ランゲージリファレンス ( 4D v16.1)
ランゲージリファレンス ( 4D v16.2)
ランゲージリファレンス ( 4D v16.3)