Armazenando Dados em Cache para um Serviço de Cronômetro

Se desejar otimizar o acesso ao banco de dados e chamadas SQL para um serviço de cronômetro EJB, você poderá ativar o servidor de aplicativos para armazenar dados em cache para este cronômetro. O armazenamento em cache permite que o servidor de aplicativos reutilize dados do cronômetro sem precisar consultar o banco de dados sempre que esses dados forem necessários.

Sobre Esta Tarefa

Ao permitir que o servidor de aplicativos armazene dados em cache para um serviço de cronômetro Enterprise JavaBeans (EJB), é possível reduzir o número de instruções SQL que seriam geradas para chamadas para métodos na interface do cronômetro. Quando este recurso for ativado, os dados para o cronômetro serão armazenados em cache no objeto de cronômetro quando você criar este objeto de cronômetro.

A especificação para enterprise beans requer que seja feita uma chamada SQL para o banco de dados para cada chamada para a interface javax.ejb.Timer, para que o aplicativo possa assegurar que o cronômetro EJB esteja usando os dados mais atuais que estão disponíveis. Se estes métodos forem chamados com frequência, ou se você tiver muitos cronômetros EJB que chamam qualquer um destes métodos, o servidor de aplicativos estará gerando muitas instruções SQL em um período de tempo muito curto. Em alguns casos, é possível achar que a conformidade estrita com este requisito é prejudicial ao desempenho e causa mais sobrecarga do que a garantida.

Por exemplo, considere um caso em que um cronômetro expira apenas às 12h00 todas as segundas-feiras de manhã. No decorrer da semana, os aplicativos que chamam métodos na interface do cronômetro resultarão na criação de uma chamada SQL, mas a chamada sempre retornará os mesmos dados. Além disso, quando um aplicativo chama o método ejbTimeout para um cronômetro, os dados associados a esse cronômetro não podem ser alterados; os dados do cronômetro que estão armazenados no banco de dados não podem ser atualizados enquanto um método ejbTimeout estiver em execução para esse cronômetro. Portanto, quaisquer chamadas de método subsequentes feitas por aplicativos durante o período de tempo limite causarão a geração de uma chamada SQL desnecessária e um trip desperdiçado para o banco de dados.

No entanto, se você ativar o armazenamento em cache para dados do cronômetro, o servidor de aplicativos consultará o banco de dados apenas na primeira vez que um método configurado for chamado. Para quaisquer chamadas subsequentes para um dos métodos configurados, o servidor de aplicativos usará os dados em cache durante a existência do objeto de cronômetro e uma nova chamada SQL não precisará ser gerada.

Evitar Problemas Evitar Problemas: Esteja ciente das seguintes condições:
  • Quando este recurso estiver ativado, sua configuração não será compatível com a especificação EJB.
  • Este recurso pode causar a possibilidade de um cronômetro usar dados obsoletos. Os dados em cache para um serviço de cronômetro se tornarão obsoletos após decorrer o próximo período de expiração para o cronômetro.

    Por exemplo, suponha que você tenha um cronômetro que esteja configurado para expirar a cada hora. Se você criar e salvar o objeto de cronômetro, os dados armazenados em cache pelo servidor de aplicativos para este objeto serão atuais apenas por uma hora. Os dados em cache serão iguais aos dados que estão armazenados no banco de dados.

    Se você chamar qualquer um dos métodos de cronômetro dentro da primeira hora, os dados do cronômetro serão atuais. No entanto, após este período de expiração, os dados em cache para o cronômetro ficam antigos e podem não refletir os dados que realmente estão no banco de dados. Neste exemplo, se você consultou o contêiner EJB para todos os cronômetros a cada meia hora, o aplicativo retornaria um novo objeto de cronômetro que contém dados em cache que serão atuais durante trinta minutos; isto porque na segunda hora, o cronômetro expirará novamente e os dados em cache antigos permanecerão antigos.

gotcha

Procedimento

  1. No console administrativo do servidor de aplicativos, selecione o servidor que deseja configurar. Clique em Servidores > Servidores de Aplicativos > server.
  2. Na área Infraestrutura do Servidor, selecione Gerenciamento de Java e Processos > Definição de Processo.
  3. Na área Propriedades Adicionais, selecione Java Virtual Machine.
  4. Na área Propriedades Adicionais no painel Java™ Virtual Machine, selecione Propriedades Customizadas.
  5. Crie ou modifique a propriedade customizada com.ibm.websphere.ejbcontainer.allowCachedTimerDataFor.
    • Se a propriedade não existir, clique em Novo para criá-la.
    • Se a propriedade já existir, selecione-a e clique em Modificar para alterar os valores.
  6. Insira com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname para o nome da propriedade customizada.
  7. Determine o melhor valor para sua necessidades e ambiente. O valor para esta propriedade permite o maior controle necessário sobre o armazenamento em cache. É possível especificar um curinga ou usar nomes de cronômetros específicos, e é possível fazer o ajuste fino do controle sobre quais métodos são armazenados em cache, designando valores de número inteiro com base nesses métodos.
    Estes valores de número inteiro permitem o controle preciso sobre quais métodos têm permissão para usar dados em cache. Os números inteiros são designados em uma base por bean ou a todos os beans, se você usar um asterisco (*). Os valores de número inteiro e seus métodos correspondentes são:
    1
    Especifica o método getHandle()
    2
    Especifica o método getInfo()
    4
    Especifica o método getNextTimeout()
    8
    Especifica o método getTimeRemaining()
    16
    Especifica o método getSchedule()
    32
    Especifica o método isPersistent()
    64
    Especifica o método isCalendarTimer()
    Nota: É possível aplicar esta propriedade nestes métodos individuais usando o valor de número inteiro designado ou é possível aplicá-lo em uma combinação destes métodos. Por Exemplo:
    • Para aplicar esta propriedade ao método getHandle e ao método getTimeRemaining, some o valor de número inteiro para os dois métodos e use o valor 9 (1+8).
    • Para aplicar a propriedade a todos os sete métodos, use o valor 127 (1+2+4+8+16+32+64), ou você não poderá especificar um número inteiro. O comportamento padrão quando esta propriedade estiver configurada é aplicar o armazenamento em cache a todos os métodos.
    Ao tomar sua decisão, use um curinga para especificar todos os cronômetros, ou especifique os nomes da JNDI dos beans de cronômetro para os quais o servidor de aplicativos aplicará o armazenamento em cache.
    • É possível inserir um asterisco (*), que configurará todos os cronômetros, opcionalmente seguido por um valor de número inteiro - ou soma de valores de número inteiro - que indicam o método aplicável na interface de cronômetro. Se não for especificado um valor de número inteiro, o servidor de aplicativos aplicará o armazenamento em cache a todos os métodos.
      Por exemplo, o seguinte valor aplica o armazenamento em cache a métodos para todos os cronômetros:
      *
    • É possível inserir o nome do bean do cronômetro EJB, opcionalmente seguido por um valor de número inteiro - ou soma de valores de número inteiro - que indicam o método aplicável na interface de cronômetro. Para inserir mais de um bean do cronômetro, separe cada nome do aplicativo com dois pontos (:). Se não for especificado um valor de número inteiro, o servidor de aplicativos aplicará o armazenamento em cache a todos os métodos.
      Por exemplo, o seguinte valor aplica o armazenamento em cache a todos os métodos para MyTimerBean1 e MyTimerBean2:
      MyApp1#MyEJBModule1#MyTimerBean1:MyApp2#MyEJBModule2#MyTimerBean2
  8. Selecione OK.
  9. Reinicie o servidor de aplicativos.

Exemplo

Os seguintes exemplos demonstram diferentes maneiras de implementar o recurso de armazenamento em cache para serviços de cronômetro. Suponha que você possui dois aplicativos, e cada aplicativo possui cronômetros. Os cronômetros usam os seguintes nomes J2EE:
  • App1#EJBJar1.jar#EJBTimer1
  • App2#EJBJar2.jar#EJBTimer2
Os exemplos mostrarão o valor para uso para a propriedade customizada com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname.
Exemplo 1
Este exemplo aplica o armazenamento em cache a todos os métodos, para todos os cronômetros e para todos os aplicativos.
Utilize um dos seguintes valores:
  • Usando os padrões:
    *
  • Especificando um número inteiro:
    *=127
Exemplo 2
Este exemplo aplica o armazenamento em cache ao método getInfo em todos os cronômetros para todos os aplicativos.
Use o seguinte valor:
*=2
Exemplo 3
Este exemplo aplica o armazenamento em cache aos métodos getHandle e getNextTimeout em EJBTimer2.
Use o seguinte valor:
App2#EJBJar2.jar#EJBTimer2=5
Exemplo 4
Este exemplo aplica o armazenamento em cache:
  • ao método getInfo em EJBTimer1
  • aos métodos getNextTimeout e getTimeRemaining em EJBTimer2
Use o seguinte valor:
App1#EJBJar1.jar#EJBTimer1=2:App2#EJBJar2.jar#EJBTimer2=12

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_timercache
Nome do arquivo: tejb_timercache.html