4D-jp 4D Japan Technical Support Team

リクエストログを使ってORDAコードを最適化

2019-09-03
Marie-Sophie Landrieu-Yvert

logOrdaRequests—blanc-1024x512

これまでにクライアントと4D Server間で送信されるORDAのリクエストのトラフィックを分析する必要を感じたことはありませんか?時にサーバーからレスポンスを受け取るまでに間があることがあります。それがネットワークのトラフィックのせいなのか、あるいは最適化されていないリクエストを書いたせいなのか考えさせられる場合があります。幸いなことに、4D V17 R6は、ds オブジェクトで使用可能な新しいORDAメソッドを使って、この遅延の原因を特定することができます。これらはデバッギング機能であるだけではなく、送信されたリクエストをよりよく理解してORDAコードを最適化することもできるようになりました。

ORDAでロギングをリクエストする

startRequestLog()メンバー・メソッドはとてもフレキシブルです。ORDAリクエストログをファイルもしくはメモリに取ることができます。

ファイルにログを取る

ファイルにログを取るには、シンプルにstartRequestLog()を、ORDAリクエストがログインする場所を示すFileオブジェクトとともにコールするだけです。以下の例では、時々クエリーをインデックス化されていないフィールド上で走らせます。この新しい機能のおかげで、リクエストの継続時間をチェックできます:

C_OBJECT($first;$e)
C_COLLECTION($log)

ds.startRequestLog(10) // Only the last 10 requests will be kept in memory
$first:=ds.Persons.all().first()
$e:=ds.Persons.query("name=:1";"Brown")
$log:=ds.getRequestLog()
ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")
ds.stopRequestLog()

各リクエストはオブジェクトのJSON表現としてログを取られます。

以下はORDARequests.txtファイルの内容です:

[
{
...
"startTime":"2019-07-02T12:33:25.922Z",
"endTime":"2019-07-02T12:33:27.681Z",
"duration":4200,
"response":{ ...}
...
}
]

メモリーにログを取る

各リクエストはコレクションの中にオブジェクトとしてログを取られます。getRequestLog() メンバー・メソッドを使って検索することができます。

コレクションを返すので、可能なコレクション・メソッドは全て使用できます。

C_OBJECT($first;$e)
C_COLLECTION($log)

ds.startRequestLog(10) // Only the last 10 requests will be kept in memory
$first:=ds.Persons.all().first()
$e:=ds.Persons.query("name=:1";"Brown")
$log:=ds.getRequestLog()
ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")
ds.stopRequestLog()

ORDAリクエストのログを不可にする

上記のサンプルが示す通り、ORDAリクエストのログを止めるには、stopRequestLog() メンバー・メソッドをコールするだけです。


関連記事

リンク