In una versione precedente, avete scoperto che le richieste ORDA REST sono state ottimizzate automaticamente per aumentare le prestazioni quando si lavora con un datastore remoto e con configurazioni client/server.
Si è appreso che è possibile utilizzare i contesti per sfruttare l’ottimizzazione automatica delle richieste ORDA REST.
Questo è stato un passo importante, ma ora vi offriamo il controllo completo sul comportamento delle vostre richieste REST. Poiché le prestazioni sono una preoccupazione strategica, non vedrete l’ora di scoprire questa nuova funzionalità!
E non è tutto: sono ora disponibili nuovi strumenti per aiutarvi a capire e a eseguire il debug dei vostri problemi.
Continuate a leggere per una presentazione completa.
HDI: Come iniziare a controllare le richieste REST?
Vi ricordate cos’è il contesto?
Prima di iniziare, ecco un rapido riassunto:
- quando si lavora con una selezione di entità, dopo una fase di apprendimento, 4D attiva automaticamente delle richieste ottimizzate (chiedendo al server pagine di entità con solo gli attributi appropriati)
- è possibile utilizzare un contesto per rendere persistente tale ottimizzazione e riutilizzarla quando si lavora con altre selezioni di entità (o entità)
Avete sentito parlare della cache orda?
Quando si richiedono dati al server con ORDA, questi vengono inseriti nella cache ORDA sul computer client.
La cache ORDA è organizzata per classi di dati. Le entità caricate vengono memorizzate nella cache ORDA come oggetti contenenti il contenuto degli attributi richiesti.
Per maggiori dettagli sui contesti e sulla cache ORDA, guardate la sessione del Summit 2020.
Il nuovo passo: prendere il controllo completo dei contesti
Come avete capito, gli attributi di un contesto sono definiti dalla fase di apprendimento di 4D. Grazie al datastore, il grande passo avanti è che ora è possibile decidere quali attributi includere in un determinato contesto con la funzione .setRemoteContextInfo().
esempio
In questo esempio, inseriamo gli attributi firstname e lastname della classe di dati Persone nel contestoA.
In questo modo, quando si chiama la funzione all() la prima entità Persons non è completamente caricata per la fase di apprendimento. Le richieste inviate al server sono già completamente ottimizzate.
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("contestoA"; "Persone"; New collection("nome"; "cognome"))
$contextA :=New object("contesto"; "contestoA")
$persons :=$ds.Persons.all($contestoA)
$text :="
For each ($p; $persons)
$text :=$p.firstname+" "+$p.lastname
End for each
sulle caselle di riepilogo
Si noti che se la selezione dell’entità $persone è usata in una casella di riepilogo, è possibile specificare gli attributi desiderati nel contesto della modalità pagina.
Nell’esempio seguente, il contesto della casella di riepilogo contiene gli attributi firstname e lastname della classe di dati Persone.
Quando si seleziona un’entità, questa viene immediatamente caricata con gli attributi del contesto dell’elemento corrente (firstname, lastname, children, gender).
Non c’è più una fase di apprendimento che richieda il caricamento completo della prima entità.
var $contextPersons
FormpersonsFormdsPersonsall$contextPersons: Object
var $listAttributes ; $pageAttributes: Collection
$contextPersons :=New object("contesto"; "persone")
$listAttributes :=New collection("nome"; "cognome")
Form .ds.setRemoteContextInfo("persone"; Form.ds.Persons; $listAttributes) //Form.ds is a remote datastore
$pageAttributes :=New collection("nome"; "cognome"; "figli"; "sesso")
Form .ds.setRemoteContextInfo("persone"; Form.ds.Persons; $pageAttributes; //Form.persons is displayed in a list box
gestire la lunghezza della pagina per le selezioni di entità
È possibile impostare una lunghezza di pagina per le selezioni di entità richieste dal server. La buona notizia è che questo vale anche per gli attributi delle entità legate al genere.
Le entità Indirizzo sono richieste al server da pagine di 100 entità con l’attributo city nell’esempio seguente.
Per ogni entità Indirizzo, le entità correlate persone (selezione delle entità) sono richieste da pagine di 50 entità con gli attributi firstname e 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
la cache ORDA
Sono disponibili altri strumenti utili per gestire il timeout e la dimensione massima della cache ORDA e per ispezionare il contenuto della cache ORDA.
Ulteriori informazioni sono disponibili sul sito web della documentazione.
Ad esempio, è possibile modificare il timeout della cache ORDA per adattare la frequenza delle richieste. Questo è utile quando si sa se i dati cambieranno spesso o meno.
esempio
Nell’esempio seguente, la classe di dati Città contiene codici di avviamento postale e città che probabilmente non cambieranno molto spesso, quindi il timeout è esteso.
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))
Per risparmiare memoria, si può anche aggiornare il numero massimo di entità presenti nella cache per ogni classe di dati.
ispezionare e ripristinare i contesti
Per aiutarvi a immergervi in questo affascinante argomento, visitate la documentazione.
Importante: si noti che probabilmente sarà necessario ispezionare le richieste per una comprensione completa e per il debug.
un’altra cosa
Non molto vicina a questa funzionalità, ma preziosa, la funzione dataClass.getCount() è ora disponibile per ottenere il numero di entità in una classe di dati.
Questo evita di chiamare dataclass. all().length costruisce una selezione di entità sul server e carica completamente la prima entità sul client.
var $count : Integer
$count :=ds.Persons.getCount()
ora giocare con l’HDI e la demo di Summit 2020
Scaricate la demo della sessione HDI and the Summit 2020 per saperne di più!