以前のバージョンで、リモートデータストアとクライアント/サーバー構成で作業するときにパフォーマンスを向上させるために、ORDA RESTリクエストが自動的に最適化される方法を発見しました。
ORDA RESTリクエストの自動最適化を利用するために、コンテキストを使用できることを学びました。
これは重要なステップでしたが、今度はRESTリクエストの動作を完全に制御できるようにすることを提案します。パフォーマンスは戦略的な関心事なので、この新機能をぜひ発見してください。
さらに、問題を理解しデバッグするのに役立つ新しい ツールも利用できるようになりました。
プレゼンテーションの全容は、引き続きご覧ください。
コンテキストが何であるか覚えていますか?
始める前に、ここで簡単にまとめておきます。
- 学習段階の後、エンティティを選択すると、4Dは自動的に最適化されたリクエスト(適切な属性のみを持つエンティティのページをサーバーに要求)をトリガーします。
- コンテキストを使って、その最適化を持続させ、他のエンティティセレクション(またはエンティティ)で作業するときに再利用することができます。
ORDAキャッシュについてご存知でしょうか?
ORDAでサーバーにデータを要求すると、クライアントマシンのORDAキャッシュに入れられる。
ORDAキャッシュはデータクラスごとに構成されています。読み込まれたエンティティは、要求された属性の内容を含むオブジェクトとしてORDAキャッシュに格納される。
コンテキストとORDAキャッシュの詳細については、Summit 2020のセッションをご覧ください。
新たなステップ:コンテキストを完全に制御する
ご理解の通り、コンテキストの属性は4Dの学習フェーズで定義されます。データストアのおかげで、与えられたコンテキストにどのような属性を含めるかを.setRemoteContextInfo()関数で決定できるようになったことが大きな前進です。
例
この例では、Persons データクラスのfirstname とlastname 属性を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
etc. “etc. “etc. “etc. “etc. “etc.”(以下省略
("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.lastname
End for each
リストボックスについて
なお、$personsの実体選択をリストボックスで使用する場合、ページモードコンテキストで必要な属性を指定することができます。
以下の例では、リスト・ボックス・コンテキストに Persons データクラスのfirstname とlastname 属性が含まれています。
エンティティを選択すると、現在のアイテム・コンテキスト(firstname,lastname,children,gender )の属性が直ちにロードされます。
最初のエンティティが完全にロードされることを要求する学習フェーズはもう存在しません。
var $contextPersons $listAttributes
“name”; “stop”・「名」「姓」「名」「名」
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.姓名";「姓名」「名」) ;
//Form.persons is displayed in a list box
エンティティ選択時のページ長を処理する
サーバーから要求されたエンティティセレクションのページ長を設定できることに注意してください。良いことに、これは種類に関連するエンティティの属性にも適用されます。
以下の例では,Address実体は,city 属性をもつ100個の実体のページによって,サーバに要求される。
各Addressエンティティに対して、関連エンティティpersons(エンティティ選択)は、firstname とlastname の属性を持つ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()