Colocación en memoria caché de un servicio de temporizador

Si desea optimizar el acceso de la base de datos y las llamadas SQL a un servicio de temporizador EJB, puede habilitar el servidor de aplicaciones para que coloque en la memoria caché los datos de dicho temporizador. La colocación en memoria caché permite al servidor de aplicaciones volver a utilizar los datos de temporizador sin tener que consultar la base de datos cada vez que se necesiten dichos datos.

Acerca de esta tarea

Al permitir que el servidor de aplicaciones almacene en la memoria caché los datos para un servicio de temporizador EJB (Enterprise JavaBeans), puede minimizar el número de sentencias SQL que se generarían para llamadas a métodos en la interfaz de temporizador. Cuando esta característica está habilitada, los datos del temporizador se colocan en la memoria caché del objeto de temporizador, cuando se crea éste último.

La especificación para los enterprise beans requiere que se efectúe una llamada SQL a la base de datos para cada llamada a la interfaz javax.ejb.Timer, de modo que la aplicación pueda asegurarse de que el temporizador EJB utilice los datos más actuales que haya disponibles. Si se llama a estos métodos a menudo, o se tienen muchos temporizadores EJB que llamen a cualquiera de estos métodos, el servidor de aplicaciones generará muchas sentencias SQL en un período de tiempo muy corto. En algunos casos, es posible que encuentre que una adhesión estricta a este requisito es perjudicial para el rendimiento, y que cause más sobrecarga de la garantizada.

Por ejemplo, considere un caso en el que un temporizador caduca sólo a las 12:00 del mediodía cada lunes. Durante el transcurso de la semana, las aplicaciones que llaman a los métodos de la interfaz de temporizador crearán una llamada SQL, pero ésta no siempre devolverá los mismos datos. Además, cuando una aplicación llama al método ejbTimeout para un temporizador, no se pueden cambiar los datos asociados a dicho temporizador; los datos del temporizador que estén almacenados en la base de datos no se podrán actualizar mientras se esté ejecutando un método ejbTimeout para dicho temporizador. Por tanto, cualquier llamada de método posterior que las aplicaciones efectúen durante el periodo de espera generarán una llamada SQL innecesaria, y un acceso desperdiciado a la base de datos.

No obstante, si habilita la colocación en memoria caché para los datos de temporizador, el servidor de aplicaciones sólo consulta la base de datos la primera vez que se llama a un método configurado. Para las llamadas subsiguientes a uno de los métodos configurados, el servidor de aplicaciones utilizará los datos de la memoria caché durante la vida del objeto de temporizador y no será necesario genera ninguna llamada SQL nueva.

Avoid trouble Avoid trouble: Tenga en cuenta las condiciones siguientes:
  • Cuando esta característica esté habilitada, la configuración no será compatible con la especificación EJB.
  • Esta característica puede generar la posibilidad de que un temporizador utilice datos obsoletos. Los datos colocados en la memoria caché de un servicio de temporizador quedarán obsoletos una vez que haya transcurrido el siguiente periodo de caducidad del temporizador.

    Por ejemplo, suponga que tiene un temporizador que está configurado para caducar cada hora. Si crea y guarda el objeto de temporizador, los datos que el servidor de aplicaciones coloca en la memoria caché para dicho objeto sólo serán actuales durante una hora. Los datos de la memoria caché serán los mismos que los datos que estén almacenados en la base de datos.

    Si llama a cualquiera de los métodos de temporizador durante la primera hora, los datos de temporizador se podrán considerar actuales. No obstante, una vez transcurrido dicho período de caducidad, los datos de la memoria caché del temporizador quedarán obsoletos, y es posible que no reflejen los datos que realmente haya en la base de datos. En este ejemplo, si ha consultado el contenedor de EJBpara todos los temporizadores después de una hora y media, la aplicación obtendrá un objeto de temporizador nuevo que contendrá los datos de la memoria caché que serán los actuales durante treinta minutos; esto se debe a el temporizador volverá a caducar en la hora dos, y todos los datos obsoletos que se hayan colocado en la memoria caché quedarán obsoletos.

gotcha

Procedimiento

  1. En la consola administrativa del servidor de aplicaciones, seleccione el servidor que desea configurar. Pulse Servidores > Servidores de aplicaciones > servidor.
  2. En el área Infraestructura de servidor, seleccione Java y gestión de procesos > Definición de proceso.
  3. En el área Propiedades adicionales, seleccione Máquina virtual Java.
  4. En el área Propiedades adicionales en el panel Máquina virtual Java™, seleccione Propiedades personalizadas.
  5. Cree o modifique la propiedad personalizada com.ibm.websphere.ejbcontainer.allowCachedTimerDataFor.
    • Si la propiedad no existe, pulse Nueva para crearla.
    • Si la propiedad ya existe, selecciónela y pulse Modificar para cambiar los valores.
  6. Escriba com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname para el nombre de la propiedad personalizada.
  7. Determine el mejor valor para sus necesidades y su entorno. El valor de esta propiedad le permite tener el control que necesita sobre la colocación en la memoria caché. Puede especificar un comodín o utilizar nombres de temporizador específicos, y puede ajustar el control sobre qué métodos están almacenados en caché asignando valores enteros basados en estos métodos.
    Estos valores enteros le permiten tener un control preciso sobre qué métodos le permiten utilizar los datos en colocados en la memoria caché. Los enteros se asignan en base a cada bean, o a todos los beans si utiliza un asterisco (*). Los valores enteros y sus métodos correspondientes son los siguientes:
    1
    Especifica el método getHandle().
    2
    Especifica el método getInfo().
    4
    Especifica el método getSiguienteTimeout().
    8
    Especifica el método getTimeRemaining().
    16
    Especifica el método getSchedule().
    32
    Especifica el método isPersistent().
    64
    Especifica el método isCalendarTimer().
    Nota: Puede aplicar esta propiedad en estos métodos individuales utilizando el valor entero asignado, o puede aplicarla en una combinación de estos métodos. Por ejemplo:
    • Para aplicar esta propiedad a los métodos getHandle y getTimeRemaining, sume el valor entero para los dos métodos, y utilice el valor 9 (1+8).
    • Para aplicar la propiedad a los siete métodos, utilice el valor 127 (1+2+4+8+16+32+64) o podría no especificar un entero. El comportamiento predeterminado cuando se establece esta propiedad es aplicar la colocación en la memoria caché a todos los métodos.
    Cuando tome una decisión, utilice un comodín para especificar todos los temporizadores, o bien especifique los nombres JNDI de los beans de temporizador para los que el servidor de aplicaciones aplicará la colocación en la memoria caché.
    • Puede especificar un asterisco (*), que configurará todos los temporizadores, seguido, opcionalmente, de un valor entero - o la suma de valores enteros - que indica el método aplicable en la interfaz del temporizador. Si no especifica ningún valor entero, el servidor de aplicaciones aplicará la colocación en la memoria caché a todos los métodos.
      Por ejemplo, el valor siguiente aplica la colocación en la memoria caché a los métodos de todos los temporizadores:
      *
    • Puede especificar el nombre del bean de temporizador EJB, seguido, opcionalmente, de un valor entero - o la suma de valores enteros - que indica el método aplicable en la interfaz del temporizador. Para especificar más de un bean de temporizador, separe cada nombre de aplicación con dos puntos (:). Si no especifica ningún valor entero, el servidor de aplicaciones aplicará la colocación en la memoria caché a todos los métodos.
      Por ejemplo, el valor siguiente aplica la colocación en la memoria caché a todos métodos de MyTimerBean1 y MyTimerBean2:
      MyApp1#MyEJBModule1#MyTimerBean1:MyApp2#MyEJBModule2#MyTimerBean2
  8. Seleccione Aceptar.
  9. Reinicie el servidor de aplicaciones.

Ejemplo

En los siguientes ejemplos se muestran distintas formas de implementar la característica de colocación en memoria caché para los servicios de temporizador. Suponga que tiene dos aplicaciones, y cada aplicación tiene temporizadores. Los temporizadores utilizan los nombres J2EE siguientes:
  • App1#EJBJar1.jar#EJBTimer1
  • App2#EJBJar2.jar#EJBTimer2
En los ejemplos se mostrará el valor que se debe utilizar para la propiedad personalizada com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname.
Ejemplo 1
En este ejemplo se aplica la colocación en memoria caché a todos los métodos, para todos los temporizadores y todas las aplicaciones.
Utilice uno de los siguientes valores:
  • Utilizando los valores predeterminados:
    *
  • Especificando un entero:
    *=127
Ejemplo 2
En este ejemplo se aplica la colocación en memoria caché al método getInfo en todos los temporizadores y todas las aplicaciones.
Utilice el valor siguiente:
*=2
Ejemplo 3
En este ejemplo se aplica la colocación en memoria caché a los métodos getHandle y getNextTimeout en EJBTimer2.
Utilice el valor siguiente:
App2#EJBJar2.jar#EJBTimer2=5
Ejemplo 4
En este ejemplo se aplica la colocación en memoria caché a:
  • el método getInfo en EJBTimer1
  • los métodos getNextTimeout y getTimeRemaining en EJBTimer2
Utilice el valor siguiente:
App1#EJBJar1.jar#EJBTimer1=2:App2#EJBJar2.jar#EJBTimer2=12

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_timercache
File name: tejb_timercache.html