ORDA – Optimizar o desempenho com controlo total sobre os pedidos REST

Tradução automática de Deepl

Com uma versão anterior, descobriu como os pedidos ORDA REST tinham sido automaticamente optimizados para aumentar o desempenho ao trabalhar com uma datastore remota e configurações cliente/servidor.

Aprendeu que pode utilizar contextos para tirar partido da optimização automática dos pedidos ORDA REST.

Este foi um passo significativo, mas agora oferecemos-lhe um controlo completo sobre o comportamento dos seus pedidos REST. Uma vez que o desempenho é uma preocupação estratégica, deve estar ansioso por descobrir esta nova funcionalidade!

E não é tudo; novas ferramentas estão agora disponíveis para o ajudar a compreender e a depurar os seus problemas.

Continue a ler para uma apresentação completa.

HDI: Como posso começar com o controlo de pedidos REST?

Lembra-se qual é o contexto?

Antes de começar, aqui está um resumo rápido:

  • ao trabalhar com uma selecção de entidades, após uma fase de aprendizagem, 4D desencadeia automaticamente pedidos optimizados (perguntando às páginas do servidor de entidades com apenas os atributos apropriados)
  • pode utilizar um contexto para fazer com que essa optimização persista e reutilizá-la quando se trabalha com outras selecções de entidades (ou entidades)

Já ouviu falar da cache da orda?

Ao solicitar dados ao servidor com ORDA, estes são colocados na cache ORDA na máquina do cliente.

A cache ORDA é organizada por dataclass. As entidades carregadas são armazenadas na cache ORDA como objectos contendo o conteúdo dos atributos solicitados.

Para mais detalhes sobre contextos e cache ORDA, assista à sessão da Cimeira 2020.

O novo passo: tomar o controlo completo dos contextos

Como entendeu, os atributos de um contexto são definidos pela fase de aprendizagem da 4D. Graças à datastore, o grande passo em frente é que pode agora decidir que atributos pretende incluir num determinado contexto com a função .setRemoteContextInfo().

exemplo

Neste exemplo, colocamos os atributos firstname e lastname da classe de dados Persons dataclass no contextoA.

Assim, ao chamar o all() a primeira entidade Pessoas não está totalmente carregada para a fase de aprendizagem. Os pedidos enviados para o servidor já estão totalmente optimizados.

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"); "escolas")

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

sobre caixas de listagem

Note que se a selecção da entidade $persons for utilizada numa caixa de listagem, pode especificar os atributos desejados no contexto do modo página.

No exemplo abaixo, o contexto da caixa de listagem contém os atributos firstname e lastname da classe de dados Persons dataclass.

Ao seleccionar uma entidade, ela é imediatamente carregada com os atributos do contexto do item actual (firstname, lastname, children, gender).

Não há mais nenhuma fase de aprendizagem que exija que a primeira entidade seja totalmente carregada.

var $contextPersons

FormpersonsFormdsPersonsall$contextPersons A primeira entidade deve ser carregada na totalidade: Object
var $listAttributes ; $pageAttributes: Collection

$contextPersons :=New object("contexto"; "pessoas")
$listAttributes :=New collection("primeiro nome"; "último nome")

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

$pageAttributes :=New collection("primeiro nome"; "último nome"; "crianças"; "género")
Form .ds.setRemoteContextInfo("pessoas"; Form.ds.Persons; $pageAttributes; //Form.persons is displayed in a list box

comprimento da página de manipulação para selecção de entidades

Esteja ciente de que pode definir um comprimento de página para as selecções de entidades solicitadas pelo servidor. A boa notícia é que isto também se aplica a atributos de entidades relacionadas com a família.

As entidades de Endereço são solicitadas ao servidor por páginas de 100 entidades com o atributo city no exemplo abaixo.

Para cada entidade Endereço, as entidades relacionadas (selecção de entidades) são solicitadas por páginas de 50 entidades com o atributo firstname e lastname.

var $ds

As entidades com os atributos 4D: .DataStoreImplementation
var $contextA : Object
var $addresses : cs.AddressSelection
var $a AddressEntity
: cs.PersonsEntityvar $p : cs.
var $text : Text$ds :=Open datastore(New object("hostname"; "school.acme.com"); "escolas")

$ds .setRemoteContextInfo("contextA"; $ds.Address; "cidade, pessoas:50, pessoas.último nome, pessoas.primeiro nome"; "principal"; 100)

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

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

a cache ORDA

São fornecidas outras ferramentas úteis para lidar com o timeout da cache ORDA e o tamanho máximo e meios para inspeccionar o conteúdo da cache ORDA.

Mais informação está disponível no website de documentação.

Por exemplo, pode modificar o tempo limite da cache ORDA para adaptar a frequência dos seus pedidos. Isto é útil quando se sabe se os seus dados podem ou não mudar com frequência.

exemplo

No exemplo abaixo, o dataclass Cities contém códigos postais e cidades que não são susceptíveis de mudar muito frequentemente, pelo que o tempo limite é prolongado.

var $ds O tempo limite: 4D.DataStoreImplementation
$ds :=Open datastore(New object("hostname"; "school.acme.com"); "escolas")
// 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))

Para guardar memória, pode também actualizar o número máximo de entidades presentes na cache para cada dataclass.

inspeccionar e reiniciar os contextos

Para o ajudar a mergulhar neste assunto fascinante, visite a documentação.

Importante: Note que provavelmente precisará de inspeccionar os pedidos para uma compreensão e depuração completas.

mais uma coisa

Não muito próxima desta característica mas valiosa, a função DataClass.getCount() está agora disponível para obter o número de entidades num dataclass.

Isto evita chamar dataclass. all().length constrói uma selecção de entidade no servidor e carrega completamente a primeira entidade no cliente.

var $count : Integer

$count :=ds.Persons.getCount()

agora joga com o HDI e a demonstração da cimeira 2020

Descarregue o IDH e a demonstração da sessão da Cimeira 2020 para saber mais!

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.