タイマー・サービスのデータのキャッシング

EJB タイマー・サービスについてデータベース・アクセスと SQL 呼び出しを最適化する必要がある場合、 アプリケーション・サーバーがそのタイマーのデータをキャッシュに入れるようにすることができます。 キャッシングを使用すると、アプリケーション・サーバーは、データが必要になるたびにデータベースの照会を行う必要なしに、タイマー・データを再利用することができます。

このタスクについて

アプリケーション・サーバーが Enterprise JavaBeans (EJB) タイマー・サービスのデータをキャッシュに入れられるようにすることによって、 タイマー・インターフェースのメソッドの呼び出しのために生成される SQL ステートメントの数を最小にすることができます。 この機能を有効にすると、タイマー・オブジェクトを作成したときに、タイマー・オブジェクト内のタイマー・データがキャッシュに入れられます。

エンタープライズ Bean の仕様として、 EJB タイマーが、使用可能な最新データを使用していることをアプリケーションが保証できるようにするために、 javax.ejb.Timer インターフェースの呼び出しごとに、データベースの SQL 呼び出しが行われることが必要です。 これらのメソッドが頻繁に呼び出されたり、これらのメソッドのどれか 1 つを呼び出す EJB タイマーが多くあったりすると、 アプリケーション・サーバーは、非常に短い時間に多くの SQL を生成することになります。 場合によって、この要件に厳密に従うことでパフォーマンスに悪影響が出て、必要以上にオーバーヘッドが発生することもあります。

例えば、タイマーが毎週月曜日の朝の 12:00 AM にのみ満了するとします。 週の中で、タイマー・インターフェースのメソッドを呼び出すアプリケーションは、SQL 呼び出しを作成することになりますが、呼び出しは常に同じデータを戻します。 さらに、アプリケーションがタイマーの ejbTimeout メソッドを呼び出しているときは、そのタイマーに関連付けられているデータは変更できません。データベースに格納されているタイマーのデータは、そのタイマーに対して ejbTimeout メソッドが実行されている間は更新できません。そのため、タイムアウト期間中にアプリケーションがその後に行うメソッド呼び出しは、 不要な SQL 呼び出しを生成し、データベースを無駄に参照することになります。

一方、タイマー・データのキャッシングを有効にすると、 アプリケーション・サーバーは、構成されたメソッドが最初に呼び出されたときにだけ、データベースを照会します。 構成されたメソッドの 1 つをその後呼び出した場合、 アプリケーション・サーバーは、タイマー・オブジェクトが存続している間、キャッシュ・データを使用し、新しい SQL 呼び出しを生成する必要はありません。

トラブルの回避 (Avoid trouble) トラブルの回避 (Avoid trouble): 以下の条件がありますので注意してください。
  • この機能を有効にすると、構成は、EJB 仕様に準拠しなくなります。
  • この機能は、無効になったデータをタイマーが使用してしまう可能性につながります。 タイマー・サービスのキャッシュ・データは、タイマーの次の満了期間が経過すると無効になります。

    例えば、毎時に満了するように構成されたタイマーがあるとします。 タイマー・オブジェクトを作成して保存すると、そのオブジェクトについてアプリケーション・サーバーがキャッシュに入れたデータがカレントであるのは、1 時間のみです。 キャッシュ・データは、データベースに保管されたデータと同じになります。

    最初の 1 時間の間にいずれかのタイマー・メソッドを呼び出すと、そのタイマー・データはカレントです。 しかし、その満了期間の後、タイマーのキャッシュ・データは無効になり、実際にデータベース内に存在するデータを反映していない可能性があります。 この例で、1 時間半後にすべてのタイマーについて EJB コンテナーに照会を行うと、 アプリケーションは新しいタイマー・オブジェクトを入手しますが、それに含まれるキャッシュ・データは、その後 30 分間だけカレントになります。 これは、2 時間後になるとタイマーが再び満了し、キャッシュ・データが無効になるためです。

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 メソッドと getTimeRemaining メソッドに適用するには、 2 つのメソッドの整数値を合計した値 9 (1+8) を使用します。
    • 7 つすべてのメソッドにプロパティーを適用するには、値 127 (1+2+4+8+16+32+64) を使用するか、整数を指定しなくても構いません。 このプロパティー設定時のデフォルト動作では、キャッシングをすべてのメソッドに適用します。
    決定したら、ワイルドカードを使用してすべてのタイマーを指定するか、 アプリケーション・サーバーがキャッシングを適用するタイマー Bean の JNDI 名を指定します。
    • すべてのタイマーを構成するアスタリスク (*) を入力した後に、オプションで、 タイマー・インターフェースの適用可能なメソッドを示す整数値、または整数値の和を指定することができます。 整数値を指定しないと、アプリケーション・サーバーはすべてのメソッドにキャッシングを適用します。
      例えば、次の値では、すべてのタイマーのメソッドにキャッシングを適用します。
      *
    • EJB タイマー Bean の名前を入力した後に、オプションで、 タイマー・インターフェースの適用可能なメソッドを示す整数値、または整数値の和を指定することができます。 複数のタイマー Bean を入力する場合には、各アプリケーション名をコロン (:) で区切ります。 整数値を指定しないと、アプリケーション・サーバーはすべてのメソッドにキャッシングを適用します。
      例えば、次の値では、MyTimerBean1 と MyTimerBean2 のすべてのメソッドにキャッシングを適用します。
      MyApp1#MyEJBModule1#MyTimerBean1:MyApp2#MyEJBModule2#MyTimerBean2
  8. OK」を選択します。
  9. アプリケーション・サーバーを再始動します。

以下の例では、タイマー・サービスのキャッシング機能実装のさまざまな方法を示します。 2 つのアプリケーションがあり、それぞれのアプリケーションにタイマーがあるとします。 これらのタイマーが使用する 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