高速缓存计时器服务的数据

如果要针对 EJB 计时器服务优化数据库访问和 SQL 调用,那么可允许应用程序服务器高速缓存该计时器的数据。高速缓存允许应用程序服务器复用计时器数据,从而不必在每次需要该数据时查询数据库。

关于此任务

通过允许应用程序服务器高速缓存 Enterprise JavaBeans (EJB) 计时器服务的数据,可将针对计时器接口上的方法的调用生成的 SQL 语句数降至最低。如果启用此功能,那么创建该计时器对象时,计时器的数据将高速缓存在计时器对象中。

企业 Bean 的规范要求对 javax.ejb.Timer 接口的每个调用生成一个对数据库的 SQL 调用,以便应用程序可确保 EJB 计时器使用最新可用数据。如果经常调用这些方法,或者您有许多 EJB 计时器可调用其中任何方法,那么应用程序服务器将在很短时间内生成许多 SQL 语句。在某些情况下,您可能会发现严格遵循此要求对性能不利,并且会导致开销增加。

例如,考虑计时器仅在每周一上午 12:00 到期的情况。在该周内,对计时器接口调用方法的所有应用程序将导致创建 SQL 调用,但该调用将始终返回相同数据。此外,如果应用程序对计时器调用 ejbTimeout 方法,那么与该计时器相关联的数据无法更改;对该计时器运行 ejbTimeout 方法时,无法更新存储在数据库中的计时器数据。因此,应用程序在超时时间段进行的所有后续方法调用将导致生成不必要的 SQL 调用并且会对数据库进行不必要的传递。

如果对计时器数据启用高速缓存,那么仅当第一次调用所配置方法时,应用程序服务器才会查询数据库。对于对某个所配置方法的后续调用,应用程序服务器将在计时器对象的有效期内使用高速缓存数据,而不需要生成新 SQL 调用。

避免故障 避免故障: 一定要考虑到下列条件:
  • 启用此功能后,配置将不符合 EJB 规范。
  • 此功能可能导致计时器使用旧数据。计时器的下一个到期时间段过去后,计时器服务的高速缓存数据将变旧。

    例如,假定计时器配置为每小时到期一次。如果创建并保存计时器对象,那么应用程序服务器针对该对象高速缓存的数据的保鲜期只有一个小时。高速缓存数据将与存储在数据库中的数据完全相同。

    如果在第一个小时内调用任何计时器方法,那么计时器数据都是最新的。但是,到期时间段过去后,该计时器的高速缓存数据变旧,并且可能不会反映数据库中的实际数据。在此示例中,如果在一个小时和一个半小时后查询所有计时器的 EJB 容器,那么应用程序将返回新计时器对象,该对象包含保鲜期为 30 分钟的高速缓存数据;这是因为第二个小时时,计时器将再次到期,所有高速缓存数据将变旧。

gotcha

过程

  1. 在应用程序服务器的管理控制台中,选择要配置的服务器。 单击服务器 > 应用程序服务器 > server
  2. 在“服务器基础结构”区域中,选择 Java 和进程管理 > 进程定义
  3. 在“其他属性”区域中,选择 Java 虚拟机
  4. 在“其他属性”区域的“Java™ 虚拟机”面板上,选择定制属性
  5. 创建或修改 com.ibm.websphere.ejbcontainer.allowCachedTimerDataFor 定制属性。
    • 如果此属性尚不存在,请单击新建以创建该属性。
    • 如果该属性已存在,请选择该属性并单击修改以更改值。
  6. 输入 com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname 作为定制属性的名称。
  7. 确定最适合您的需要和环境的值。 此属性的值允许您根据需要控制高速缓存。可指定通配符或使用特定计时器名称,还可通过根据这些方法分配整数值来微调高速缓存的方法。
    这些整数值允许您详细控制允许使用高速缓存数据的方法。整数是针对逐个 bean 分配的,如果使用星号 (*),那么整数会分配为所有 bean。整数值及其对应方法为:
    1
    指定 getHandle() 方法
    2
    指定 getInfo() 方法
    4
    指定 getNextTimeout() 方法
    8
    指定 getTimeRemaining() 方法
    16
    指定 getSchedule() 方法
    32
    指定 isPersistent() 方法
    64
    指定 isCalendarTimer() 方法
    注: 可使用所分配整数值对这些个别方法应用此属性,也可对这些方法的组合应用此属性。例如:
    • 要对 getHandle method 和 getTimeRemaining 方法应用此属性,请对两个方法的整数值求和,然后使用值 9 (1+8)。
    • 要对所有七个方法应用该属性,请使用值 127 (1+2+4+8+16+32+64),不能指定整数。设置此属性后的缺省行为是对所有方法应用高速缓存。
    制定决策后,使用通配符来指定所有计时器,或指定应用程序服务器将对其应用高速缓存的计时器 bean 的 JNDI 名称。
    • 可输入 (*),这表示配置所有计时器,可选择后跟整数值 - 或整数值之和 - 指示可对计时器接口应用的方法。如果未指定整数值,那么应用程序服务器将对所有方法应用高速缓存。
      例如,以下值对所有计时器的方法应用高速缓存:
      *
    • 可输入 EJB 计时器 bean 的名称,可选择后跟整数值 - 或整数值之和 - 指示可对计时器接口应用的方法。要输入多个计时器 bean,请使用冒号 (:) 来分隔每个应用程序名称。如果未指定整数值,那么应用程序服务器将对所有方法应用高速缓存。
      例如,以下值对 MyTimerBean1 和 MyTimerBean2 的所有方法应用高速缓存:
      MyApp1#MyEJBModule1#MyTimerBean1:MyApp2#MyEJBModule2#MyTimerBean2
  8. 选择确定
  9. 重新启动应用程序服务器。

示例

以下示例说明对计时器服务实现高速缓存功能的不同方法。假定您有两个应用程序,每个应用程序都有计时器。这些计时器使用以下 J2EE 名称:
  • App1#EJBJar1.jar#EJBTimer1
  • App2#EJBJar2.jar#EJBTimer2
这些示例将显示要用于 com.ibm.websphere.ejbcontainer.allowCachedTimerDataForname 定制属性的值。
示例 1
此示例对所有计时器和所有应用程序的所有方法应用高速缓存。
请使用下列其中一个值:
  • 使用缺省值:
    *
  • 指定整数:
    *=127
示例 2
此示例对所有应用程序的所有计时器上的 getInfo 方法应用高速缓存。
使用以下值:
*=2
示例 3
此示例对 EJBTimer2 上的 getHandle 和 getNextTimeout 方法应用高速缓存。
使用以下值:
App2#EJBJar2.jar#EJBTimer2=5
示例 4
此示例对以下各项应用高速缓存:
  • EJBTimer1 上的 getInfo 方法
  • EJBTimer2 上的 getNextTimeout 和 getTimeRemaining 方法
使用以下值:
App1#EJBJar1.jar#EJBTimer1=2:App2#EJBJar2.jar#EJBTimer2=12

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_timercache
文件名:tejb_timercache.html