ORDA – RESTリクエストの完全な制御によるパフォーマンスの最適化

Deeplからの自動翻訳

以前のバージョンで、リモートデータストアとクライアント/サーバー構成で作業するときにパフォーマンスを向上させるために、ORDA RESTリクエストが自動的に最適化される方法を発見しました。

ORDA RESTリクエストの自動最適化を利用するために、コンテキストを使用できることを学びました。

これは重要なステップでしたが、今度はRESTリクエストの動作を完全に制御できるようにすることを提案します。パフォーマンスは戦略的な関心事なので、この新機能をぜひ発見してください。

さらに、問題を理解しデバッグするのに役立つ新しい ツールも利用できるようになりました。

プレゼンテーションの全容は、引き続きご覧ください。

HDI:RESTリクエスト制御を始めるには?

コンテキストが何であるか覚えていますか?

始める前に、ここで簡単にまとめておきます。

  • 学習段階の後、エンティティを選択すると、4Dは自動的に最適化されたリクエスト(適切な属性のみを持つエンティティのページをサーバーに要求)をトリガーします。
  • コンテキストを使って、その最適化を持続させ、他のエンティティセレクション(またはエンティティ)で作業するときに再利用することができます。

ORDAキャッシュについてご存知でしょうか?

ORDAでサーバーにデータを要求すると、クライアントマシンのORDAキャッシュに入れられる。

ORDAキャッシュはデータクラスごとに構成されています。読み込まれたエンティティは、要求された属性の内容を含むオブジェクトとしてORDAキャッシュに格納される。

コンテキストとORDAキャッシュの詳細については、Summit 2020のセッションをご覧ください。

新たなステップ:コンテキストを完全に制御する

ご理解の通り、コンテキストの属性は4Dの学習フェーズで定義されます。データストアのおかげで、与えられたコンテキストにどのような属性を含めるかを.setRemoteContextInfo()関数で決定できるようになったことが大きな前進です。

この例では、Persons データクラスのfirstnamelastname 属性をcontextA に入れています。

このように all()関数を呼び出したとき、最初のPersonsエンティティは、学習フェーズでは完全にロードされていません。サーバーに送信されるリクエストは、すでに完全に最適化されています。

var $ds
varvar

:4D.DataStoreImplementation
var $contextA :Objectvar $persons :cs.PersonsSelection
$p cs .PersonsEntity
$text :Text$ds :=Open datastore(New object("hostname"; "school.acme.com"); "schools")

$ds .setRemoteContextInfo
("contextA"; "Persons";New collection("firstname"; "lastname"))
$contextA :=New object("context"; "contextA")
$persons :=$ds.Persons.all($contextA)
$text :="
For each ($p;$persons)$text:=$p.firstname+" "+$p.
etc. “etc. “etc. “etc. “etc. “etc.”(以下省略lastname
End for each

リストボックスについて

なお、$personsの実体選択をリストボックスで使用する場合、ページモードコンテキストで必要な属性を指定することができます。

以下の例では、リスト・ボックス・コンテキストに Persons データクラスのfirstnamelastname 属性が含まれています。

エンティティを選択すると、現在のアイテム・コンテキストfirstname,lastname,children,gender )の属性が直ちにロードされます。

最初のエンティティが完全にロードされることを要求する学習フェーズはもう存在しません。

var $contextPersons $listAttributes

FormpersonsFormdsPersonsall$contextPersons:Object
var $listAttributes ;$pageAttributes:Collection

$contextPersons :=New object("context"; "persons")
:=New collection("firstname"; "lastname")

Form .ds.setRemoteContextInfo("persons";Form.ds.Persons;$listAttributes)//Form.ds is a remote datastore

$pageAttributes :=New collection("firstname"; "lastname"; "children"; "gender")
Form .ds.setRemoteContextInfo("persons";Form.ds.Persons;$pageAttributes.姓名";
“name”; “stop”・「名」「姓」「名」「名」「姓名」「名」) ; //Form.persons is displayed in a list box

エンティティ選択時のページ長を処理する

サーバーから要求されたエンティティセレクションのページ長を設定できることに注意してください。良いことに、これは種類に関連するエンティティの属性にも適用されます。

以下の例では,Address実体は,city 属性をもつ100個の実体のページによって,サーバに要求される。

各Addressエンティティに対して、関連エンティティpersons(エンティティ選択)は、firstnamelastname の属性を持つ50のエンティティのページによって要求されます。

var $ds

:4D.DataStoreImplementation
var $contextA :Objectvar $addresses :cs.AddressSelectionvar $a cs .AddressEntity
var $p :csPersonsEntity var $text :Text

$ds :=Open datastore(New object("hostname"; "school.acme.com"); "schools")

$ds .setRemoteContextInfo$text$text("contextA";$ds.Address; "city, persons:50, persons.lastname, persons.firstname"; "main"; 100)

$contextA :=New object("context"; "contextA")
$addresses :=$ds.Address.all($contextA)

:="
For each ($a;$addresses)
:=$text+"/" +$a.city
For each ($p;$a
.persons )
$text :=$text+" - "+$p.
但し、”+”でなければ、”+ “+”でなければならない。firstname+$p.lastname
End for each
End for each

ORDAキャッシュ

その他,ORDAキャッシュのタイムアウトや最大サイズを扱う便利なツールや,ORDAキャッシュの内容を検査する手段も提供されています.

より詳細な情報は、ドキュメントウェブサイトで入手できます。

例えば、要求の頻度に適応するようにORDAキャッシュのタイムアウトを変更することができる。これは、あなたのデータが頻繁に変更される可能性があるかどうかがわかっている場合に便利です。

以下の例では、Cities データクラスには郵便番号と都市が含まれており、これらはあまり頻繁に変更される可能性がないため、タイムアウトが延長されています。

var $ds :4D.DataStoreImplementation
$ds :=Open datastore(New object("hostname"; "school.acme.com"); "schools")
// The entities will expire after 3 hours
// There are 350 entities maximum in the cache of the Cities dataclass
$ds .Cities.setRemoteCacheSettings(New object("timeout"; 10800; "maxEntries"; 350)
))

メモリを節約するために、データクラスごとに、キャッシュに存在するエンティティの最大数を更新することもできます。

コンテキストの検査とリセット

この魅力的な主題に飛び込むのを助けるために、ドキュメントをご覧ください。

重要: 完全に理解し、デバッグするために、おそらくリクエストを検査する必要があることに注意してください。

もうひとつ

この機能とはあまり関係ありませんが、データクラス内のエンティティの数を取得するためにdataClass.getCount()関数が利用できるようになりました。

これにより、dataclass.all() を呼び出す必要がなくなります lengthは、サーバ上でエンティティ・セレクションを構築し、クライアント上で最初のエンティティを完全にロードします。

var $count :Integer

$count :=ds.Persons.getCount()

HDIとSUMMIT 2020のデモで遊んでみる

HDIとSummit 2020のセッションデモをダウンロードして、さらに学びましょう。

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。