ORDA – Optimisez les performances grâce à un contrôle total des requêtes REST

Traduit automatiquement de Deepl

Avec une version précédente, vous avez découvert comment les requêtes ORDA REST avaient été automatiquement optimisées pour augmenter les performances lors du travail avec un datastore distant et des configurations client/serveur.

Vous avez appris que vous pouvez utiliser des contextes pour profiter de l’optimisation automatique des requêtes ORDA REST.

C’était une étape importante, mais nous vous proposons maintenant d’avoir un contrôle complet sur le comportement de vos requêtes REST. La performance étant une préoccupation stratégique, vous devez être impatient de découvrir cette nouvelle fonctionnalité !

Et ce n’est pas tout, de nouveaux outils sont désormais disponibles pour vous aider à comprendre et déboguer vos problèmes.

Continuez à lire pour une présentation complète.

HDI : Comment démarrer avec le contrôle des requêtes REST ?

Vous souvenez-vous de ce qu’est le contexte ?

Avant de commencer, voici un résumé rapide :

  • lorsque vous travaillez avec une sélection d’entités, après une phase d’apprentissage, 4D déclenche automatiquement des requêtes optimisées (demandant au serveur des pages d’entités avec uniquement les attributs appropriés).
  • Vous pouvez utiliser un contexte pour faire persister cette optimisation et la réutiliser lorsque vous travaillez avec d’autres sélections d’entités (ou entités).

Avez-vous entendu parler du cache d’orda ?

Lorsque vous demandez des données au serveur avec ORDA, elles sont placées dans le cache ORDA sur la machine cliente.

Le cache ORDA est organisé par classe de données. Les entités chargées sont stockées dans le cache ORDA en tant qu’objets contenant le contenu des attributs demandés.

Pour plus de détails sur les contextes et le cache ORDA, regardez la session Summit 2020.

La nouvelle étape : prendre le contrôle complet des contextes

Comme vous l’avez compris, les attributs d’un contexte sont définis par la phase d’apprentissage de 4D. Grâce au datastore, la grande avancée est que vous pouvez désormais décider des attributs que vous souhaitez inclure dans un contexte donné avec la fonction .setRemoteContextInfo().

exemple

Dans cet exemple, nous mettons les attributs firstname et lastname de la classe de données Personnes dans le contexte contextA.

Ainsi, lors de l’appel de la fonction all() la première entité Persons n’est pas entièrement chargée pour la phase d’apprentissage. Les requêtes envoyées au serveur sont déjà entièrement optimisées.

var $ds : 4D.DataStoreImplementation
var $contextA : Object
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $text : Text

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

$ds .setRemoteContextInfo("contexteA" ; "personnes" ; New collection("prénom" ; "nom"))
$contextA :=New object("contexte" ; "contexteA")
$persons :=$ds.Persons.all($contexteA)
$text := ""
For each ($p; $persons)
$text :=$p.firstname+ ""+$p.lastname
End for each

à propos des boîtes de liste

Notez que si la sélection d’entité $persons est utilisée dans une zone de liste, vous pouvez spécifier les attributs que vous souhaitez dans le contexte du mode page.

Dans l’exemple ci-dessous, le contexte de la boîte de liste contient les attributs firstname et lastname de la classe de données Personnes.

Lors de la sélection d’une entité, celle-ci est immédiatement chargée avec les attributs du contexte de l’élément courant (firstname, lastname, children, gender).

Il n’y a plus de phase d’apprentissage nécessitant le chargement complet de la première entité.

var $contextPersons Object

FormpersonsFormdsPersonsall$contextPersons
var $listAttributes ; $pageAttributes: Collection

$contextPersons :=New object("contexte" ; "personnes")
$listAttributes :=New collection("prénom" ; "nom")

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

$pageAttributes :=New collection("prénom" ; "nom" ; "enfants" ; "sexe")
Form .ds.setRemoteContextInfo("personnes" ; Form.ds.Persons; $pageAttributes; //Form.persons is displayed in a list box

gérer la longueur des pages pour les sélections d’entités

Sachez que vous pouvez définir une longueur de page pour les sélections d’entités demandées par le serveur. La bonne nouvelle est que cela s’applique également aux attributs des entités liées au genre.

Dans l’exemple ci-dessous, les entités Adresse sont demandées au serveur par des pages de 100 entités avec l’attribut city.

Pour chaque entité Adresse, les entités liées personnes (sélection d’entités) sont demandées par des pages de 50 entités avec les attributs firstname et lastname.

var $ds : 4D.DataStoreImplementation
var $contextA : Object
var $addresses : cs.AddressSelection
var $a : cs.AddressEntity
var $p : cs.PersonsEntity
var $text : Text

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

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

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

$text := ""
For each ($a; $addresses)
$text :=$text+"/"+$a.city

For each ($p; $a
.persons )
$text :=$text+" - "+$p.firstname+$p.lastname
End for each
End for each

le cache ORDA

D’autres outils utiles sont fournis pour gérer le timeout et la taille maximale du cache ORDA et des moyens pour inspecter le contenu du cache ORDA.

De plus amples informations sont disponibles sur le site Web de la documentation.

Par exemple, vous pouvez modifier le timeout du cache ORDA pour adapter la fréquence de vos requêtes. Ceci est utile lorsque vous savez si vos données sont susceptibles de changer souvent ou non.

exemple

Dans l’exemple ci-dessous, la classe de données Cities contient des codes postaux et des villes qui ne sont pas susceptibles de changer très souvent, le délai d’attente est donc prolongé.

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))

Pour économiser de la mémoire, vous pouvez également mettre à jour le nombre maximum d’entités présentes dans le cache pour chaque classe de données.

inspecter et réinitialiser les contextes

Pour vous aider à plonger dans ce sujet fascinant, consultez la documentation.

Important: Notez que vous aurez probablement besoin d’inspecter les requêtes pour une compréhension et un débogage complets.

une autre chose

Pas très proche de cette fonctionnalité mais précieuse, la fonction dataClass.getCount() est maintenant disponible pour obtenir le nombre d’entités dans une dataclass.

Cela évite d’appeler dataclass. all().length construit une sélection d’entités sur le serveur et charge entièrement la première entité sur le client.

var $count : Integer

$count :=ds.Persons.getCount()

jouez maintenant avec la démo de l’IDH et du sommet 2020

Téléchargez la démo de la session HDI et du Sommet 2020 pour en savoir plus !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.