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

- 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.
Procedimento
Exemplo
- App1#EJBJar1.jar#EJBTimer1
- App2#EJBJar2.jar#EJBTimer2
- 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
- Usando os padrões:
- 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
App1#EJBJar1.jar#EJBTimer1=2:App2#EJBJar2.jar#EJBTimer2=12