← Projetos

Tutorial

Cache no JD Edwards

Conceitos de Business Function e cache no JDE, partes 1 a 3, e conceitos de cache no E1 – JDB Cache, partes 1 e 2, reunidos em uma única página.

Conceitos de Business Function e cache no JDE – Parte 1

Usar o cache, ou caching, é um dos conceitos fundamentais das aplicações web, ou, digamos, de qualquer aplicação, seja na camada de banco de dados, na camada de aplicação ou na camada web. No JD Edwards, o caching é feito na camada de aplicação, por meio de código, e na camada web, por meio do Server Manager (HTML Server).

Podemos examinar o caching baseado em código, que normalmente é feito por meio de Business Function (BSFN).

Sempre usamos ou vemos alguns parâmetros de business function que o JDE usa para comunicar ou passar informações

LPBHVRCOM

  • Ponteiro para uma estrutura de dados usada na comunicação com as business functions
  • Tem a capacidade de identificar a versão atual do software
  • Identifica o privilégio de acesso do usuário atual
  • Tem parâmetros que tratam a janela atual e os controles da janela
  • Pode identificar o controle atual que está com o foco
  • Identifica o momento atual do evento que está sendo processado
  • Tem o componente de ID para o identificador global de tempo de execução do job executado a partir do menu driver
  • Tem informações sobre as preferências do sistema
  • Tem informações sobre as preferências do usuário
  • Pode exibir o ID da mensagem de erro ou 0L
  • Define o flag como TRUE ao alterar o comportamento do banco de dados
  • Contém a chave de evento da mensagem de erro para as event rules
  • Tem informações sobre o handle de ambiente para ODBC
  • Contém ponteiros para a seção de RDA
  • Tem a lista encadeada de erros para programas batch
  • Armazena as informações de tempo de execução do formulário para FDA
  • Tem um flag que indica chamada de runtime ou chamada de business function
  • Armazena um flag que indica chamada remota ou objeto de chamada de terceiros
  • Tem as informações de endereço de subscription/publish da aplicação
  • Guarda o ID de processo lógico de quem chamou a API jdeLaunchUBEEx
  • Contém também uma área de uso futuro para novos itens

LPVOID

  • Ponteiro para uma estrutura de dados void, usada atualmente no processamento de erros
  • Será usado para segurança no futuro.

Temos uma Master Business Function para a maioria dos processos que inserem dados em tabelas de transação. Cada master business function usa Begin Doc, Edit Line, Edit Doc e End Doc para inserir os registros nas tabelas.

Em termos simples, de leigo, abaixo está o uso de cada função, que é chamada em sequência para criar os registros.

Nome da funçãoUso
Begin DocInicializa os caches de cabeçalho e de detalhe
Adiciona ou atualiza o cabeçalho
Edit LineAdiciona registro ao cache de detalhe
Edit DocLê o cache de cabeçalho
Atualiza o cache de cabeçalho
End DocLê os registros dos caches de cabeçalho e de detalhe e grava nas tabelas
Clear DocApaga o cache de cabeçalho
Lê o cache de detalhe
Apaga o cache de detalhe
Encerra o cache

O que é cache:

Cache é uma memória que contém informações usadas recentemente e pode ser acessada de forma extremamente rápida para manipular dados ao criar ou atualizar uma transação em uma aplicação.

Prós de usar cache:

  • O cache melhora o desempenho da aplicação em que é usado.
  • O cache reduz a carga nos servidores.
  • Com o cache, podemos armazenar dados de várias tabelas e acessá-los quando necessário.
  • O cache é útil no lugar de tabelas temporárias, reduzindo a carga nos servidores.

Contras de usar cache:

  • O cache tem limitação de capacidade de armazenamento.
  • Implementar cache exige conhecimento das APIs JDECACHE.
  • Solucionar problemas da memória cache é difícil.

Algumas APIs de cache que usamos com frequência para criar o cache e usá-lo para armazenar e atualizar registros:

PropósitoComando
Conectar ao OneWorldJDB_InitBhvr
Criar a definição da estrutura de dados do índiceIndex.CacheKey[n].nOffset
Index.CacheKey[n].nSize
Index.CacheKey[n].idDataType
Inicializar o cachejdeCacheInit
Adicionar um registro ao cachejdeAddCache
Abrir um cursor no cachejdeCacheOpenCursor
Qualquer manipulação do cacheAvançam o cursor:
👉 jdeCacheFetch
👉 jdeCacheFetchPosition
👉 jdeCacheResetCursor
Não avançam o cursor:
👉 jdeCacheUpdate
👉 jdeCacheDelete
Fechar o cursorjdeCacheCloseCursor
Encerrar o cachejdeCacheTerminate
Liberar o behaviorJDB_FreeBhvr

Conceitos de Business Function e cache no JDE – Parte 2

No nosso último artigo (parte 1), demos uma visão geral dos parâmetros padrão de uma Business Function e do uso das master business functions; também falamos sobre as APIs de cache e o seu uso.

Neste artigo, vamos demonstrar o processo de criação de um cache usando as APIs de cache e, no próximo artigo, veremos como usar esta BSFN para inserir/atualizar/buscar os dados no/do cache.

Passos para criar um cache

1. Criação da estrutura de dados

Crie uma estrutura de dados (data structure) para a Business Function.

Alguns parâmetros são obrigatórios na estrutura de dados para construir um cache, e os demais dependem do requisito.

  • Cachename – Obrigatório
  • ActionCode – Obrigatório
  • Cursor – Obrigatório
Estrutura de dados do cache

2. Associar a estrutura de dados à BSFN em C

Associar a DS à BSFN

3. Gerar o esqueleto da Business Function

Criação da função
Protótipo da função

4. Criar a definição da estrutura de dados no arquivo .h

Desenho da DS
DS no .h

5. Definir a estrutura do cache no .h

DS do cache

6. Definir a estrutura da chave do cache no arquivo .h

Chave do cache

7. Criar as instâncias do cache e da chave do cache no arquivo .c

Instâncias

8. Declarar ponteiros e variáveis no arquivo .c

Ponteiros

9. Inicializar o usuário

Inicializar o usuário

10. Inicializar o cache

O cache é inicializado com a API ‘jdeCacheInit’. Este é o passo mais importante para criar um cache.

‘jdeCacheInit’ inicializa um cache nomeado, associa o cache inicializado a um usuário e retorna um handle para o cache inicializado. Esta API contém quatro coisas:

  1. Cria um cache na memória.
  2. Cria um índice que será usado para acessar os registros no cache.
  3. Dá ao cache o nome passado nesta API.
  4. Associa o cache a um handle de cache (HCACHE), que o usuário usará para referenciar o cache nas chamadas às APIs do JDE Cache.
Inicializar o cache

11. Processamento do cache

Na maior parte das vezes, o processamento do cache consiste em adicionar, atualizar, buscar e apagar no cache.

Alguns deles estão listados abaixo:

Adicionar/atualizar no cache

‘jdeCacheAdd’ adiciona um registro ao cache identificado pelo handle de cache hCache, obtido na chamada a ‘jdeCacheInit’.

‘jdeCacheUpdate’ atualiza, com os dados passados, o registro para o qual o HJDECURSOR passado aponta no momento.

Adicionar/atualizar no cache

Busca única no cache

‘jdeCacheFetchPosition’ recupera o registro que corresponde à chave informada. Esta API pode ser usada para posicionar o HJDECURSOR em um local específico dentro do conjunto de dados. Quando for feita uma chamada a jdeCacheFetch, ela começará a buscar a partir da próxima posição. Isso é útil para fazer buscas sequenciais a partir de um local específico do cache.

Busca única no cache

Busca múltipla no cache

A busca múltipla é possível por meio da API ‘JdeCacheFetch’. ‘JdeCacheFetch’ avança o cursor para o próximo registro do conjunto de dados, em relação à posição atual do cursor, e recupera o registro. Esta passa a ser a nova posição associada ao HJDECURSOR. Esta API não procura um registro no cache, mas busca qualquer registro que esteja depois do registro para o qual o HJDECURSOR passado aponta no momento. A API é ideal para fazer buscas sequenciais

Busca múltipla no cache

Apagar do cache

‘jdeCacheDelete’ é a API que apaga o registro apontado pelo cursor. Só é possível apagar um registro por vez.

Apagar do cache

Encerrar o cache

Quando todo o processamento termina, a memória alocada para o cache deve ser destruída. ‘jdeCacheTerminateAll’ destrói todos os caches com o mesmo nome daquele com o hCache informado. Os caches são removidos fisicamente da memória.

Encerrar o cache

O código de exemplo (abaixo) para criar o cache é dado como referência.

Conceitos de Business Function e cache no JDE – Parte 3

No nosso último artigo (parte 2), demonstramos passo a passo o processo de criação da business function de cache usando as APIs de cache e explicamos o propósito das APIs de cache.

Neste artigo, veremos como usar a business function de cache em um objeto do JDE, como os valores serão armazenados no cache e como podemos manipulá-los.

Passos para usar a business function

1. Criar a aplicação para passar ou recuperar os valores, conforme abaixo

Formulário

Valores do Action Code:

  1. Adicionar/atualizar
  2. Buscar pela chave
  3. Apagar do cache

2. No botão Add Record, chamar a BSFN em C para adicionar os registros ao cache

Adicionar

3. No botão Update Record, chamar a BSFN em C para atualizar os registros no cache

Atualizar

4. No botão Fetch Record, chamar a BSFN em C para buscar os registros no cache

Buscar

5. No botão Delete Record, chamar a BSFN em C para adicionar os registros do cache

Apagar

6. Executar a aplicação no web client, digitar os valores para inserir o registro no cache e pressionar o botão Add Record

Cache 1

Podemos ver que os valores foram adicionados ao cache depois que a API jdeCacheAdd é chamada na BSFN em C

Cache 2

7. Digitar valores diferentes nos controles do formulário e pressionar novamente o botão Add Record para adicionar mais um registro ao cache

Cache 1

Podemos ver que os valores foram adicionados ao cache depois que a API jdeCacheAdd é chamada na BSFN em C

Cache 2

8. Digitar um valor diferente no controle do formulário para atualizar o primeiro registro do cache

Cache 1

Neste caso, primeiro acontece uma busca no cache para verificar se o registro existe no cache; se o registro estiver lá, ele será atualizado no cache depois que a API jdeCacheUpdate for chamada na BSFN em C.

Cache 2

9. Digitar o valor da chave para buscar o registro no cache

Cache 1

Também neste cenário, primeiro é feita uma busca para verificar a existência do registro e, se ele existir, os valores são atribuídos aos parâmetros da BSFN depois que a API jdeCacheFetchPosition retorna sucesso.

Cache 2

Os valores do primeiro registro foram exibidos na aplicação depois de pressionar o botão Fetch Record

Cache 3

10. Digitar os valores da chave para apagar o registro do cache

Cache 1

Também neste cenário, primeiro é feita uma busca para verificar a existência do registro e, se ele existir, os valores são apagados depois que a API jdeCacheDelete retorna sucesso.

Cache 2

11. Ao tentar apagar novamente o mesmo registro do cache, é retornado um erro, porque o registro não está presente

Cache 1

Da mesma forma, podemos chamar a BSFN em C para buscar os registros sequenciais do cache e destruir o cache.

Conceitos de cache no E1 – JDB Cache – Parte 1

Nos artigos anteriores, compartilhamos os conceitos do cache do JDE e a sua criação. O JDE tem dois tipos de cache; o que explicamos nos posts recentes é conhecido como User Cache ou JDECACHE.

Este artigo fala sobre o segundo tipo de cache que o JDE oferece aos seus usuários, chamado JDB F98613/ DB Cache.

Como sabemos, armazenar dados do banco de dados na memória do programa, em vez de buscá-los no banco, é conhecido como caching. Isso ajuda a eliminar o overhead do banco de dados.

O JDB Cache não é uma memória compartilhada acessada por todos os processos; é memória heap local de cada processo. Cada processo tem a sua própria cópia do DB cache.

O JDB cache é um recurso de mecanismo de caching automático de tabelas do EnterpriseOne.

Quando o processo termina, o JDB cache também vai embora com o processo, para o lixo (bit bucket).

O JDB Cache pode ser implementado por meio de código C em Business Function ou de Event Rules do JDE.

Não há replicação nem sincronização entre as instâncias do JDB cache.

Implementar o JDB cache pode ajudar a melhorar o desempenho do processo, desde que seja feito após uma análise completa.

O JDB cache é memória heap local do processo e está limitado a um total de 2GB em sistemas operacionais de 32 bits.

No próximo artigo, veremos como podemos implementar e quais são as condições para usar o JDB Cache no EnterpriseOne.

Referência:

  • JDB cache in EnterpriseOne
  • JDEdwards EnterpriseOne Applications Task Force

Conceitos de cache no E1 – JDB Cache – Parte 2

No último artigo (parte 1), compartilhamos o conceito do JDB cache e as suas características. Neste artigo, veremos como podemos implementar o JDB cache e usá-lo de forma eficiente diante dos nossos problemas de desempenho.

Como funciona

Quando uma tabela está configurada para fazer parte do JDB cache, assim que um registro é buscado na tabela, ele também é armazenado no cache, e os Selects seguintes do mesmo registro são buscados no cache em vez de no banco de dados.

Regras básicas

  1. Deve existir uma entrada na F98613, que é a lista de tabelas de cache, para a tabela.
  2. A tabela deve ser acessada usando a chave primária completa.
  3. A tabela deve ser acessada pela API ‘JDB_FetchKeyed’ em Business Function C ou usando a operação de I/O de tabela ‘Fetch Single’ nas event rules do JDE.
  4. APIs como JDB_SetSelection ou JDB_SetSequencing não devem ser chamadas ao usar o JDB cache.
  5. Não há sincronização / replicação entre processos.
F98613

Funciona da seguinte maneira:

Fluxo de atividades: a tabela está configurada na F98613? Se não, a JDB_addTableToDBCache() adicionou a tabela? Se não, buscar na tabela. A chave primária completa foi usada? Se não, buscar na tabela. O registro já está no cache? Sim: cache HIT, buscar no cache, nenhuma operação no banco de dados. Não: cache MISS, buscar na tabela e armazenar no cache.

Limitações

  1. As tabelas devem ser estáticas.
  2. Os mesmos registros devem ser buscados repetidamente.
  3. Fazer cache de tabelas dinâmicas fará as aplicações falharem.
  4. Consultas que retornam zero linha não serão armazenadas em cache.
  5. Não é recomendado fazer cache de tabelas com milhões de registros.

Benefícios

  1. Um recurso de mecanismo de caching automático de tabelas do EnterpriseOne.
  2. Adequado para tabelas que permanecem constantes e estáticas.
  3. Pode ajudar a aumentar o desempenho do processo.
  4. Comandos Select redundantes sobre a mesma chave primária podem ser eliminados usando o JDB cache.

Referência:

  • JDB cache in EnterpriseOne
  • JDEdwards EnterpriseOne Applications Task Force
↑ Voltar ao topo