タイマー・サービスのデータのキャッシング
EJB タイマー・サービスについてデータベース・アクセスと SQL 呼び出しを最適化する必要がある場合、 アプリケーション・サーバーがそのタイマーのデータをキャッシュに入れるようにすることができます。 キャッシングを使用すると、アプリケーション・サーバーは、データが必要になるたびにデータベースの照会を行う必要なしに、タイマー・データを再利用することができます。
このタスクについて
エンタープライズ Bean の仕様として、 EJB タイマーが、使用可能な最新データを使用していることをアプリケーションが保証できるようにするために、 javax.ejb.Timer インターフェースの呼び出しごとに、データベースの SQL 呼び出しが行われることが必要です。 これらのメソッドが頻繁に呼び出されたり、これらのメソッドのどれか 1 つを呼び出す EJB タイマーが多くあったりすると、 アプリケーション・サーバーは、非常に短い時間に多くの SQL を生成することになります。 場合によって、この要件に厳密に従うことでパフォーマンスに悪影響が出て、必要以上にオーバーヘッドが発生することもあります。
例えば、タイマーが毎週月曜日の朝の 12:00 AM にのみ満了するとします。 週の中で、タイマー・インターフェースのメソッドを呼び出すアプリケーションは、SQL 呼び出しを作成することになりますが、呼び出しは常に同じデータを戻します。 さらに、アプリケーションがタイマーの ejbTimeout メソッドを呼び出しているときは、そのタイマーに関連付けられているデータは変更できません。データベースに格納されているタイマーのデータは、そのタイマーに対して ejbTimeout メソッドが実行されている間は更新できません。そのため、タイムアウト期間中にアプリケーションがその後に行うメソッド呼び出しは、 不要な SQL 呼び出しを生成し、データベースを無駄に参照することになります。
一方、タイマー・データのキャッシングを有効にすると、 アプリケーション・サーバーは、構成されたメソッドが最初に呼び出されたときにだけ、データベースを照会します。 構成されたメソッドの 1 つをその後呼び出した場合、 アプリケーション・サーバーは、タイマー・オブジェクトが存続している間、キャッシュ・データを使用し、新しい SQL 呼び出しを生成する必要はありません。

- この機能を有効にすると、構成は、EJB 仕様に準拠しなくなります。
- この機能は、無効になったデータをタイマーが使用してしまう可能性につながります。
タイマー・サービスのキャッシュ・データは、タイマーの次の満了期間が経過すると無効になります。
例えば、毎時に満了するように構成されたタイマーがあるとします。 タイマー・オブジェクトを作成して保存すると、そのオブジェクトについてアプリケーション・サーバーがキャッシュに入れたデータがカレントであるのは、1 時間のみです。 キャッシュ・データは、データベースに保管されたデータと同じになります。
最初の 1 時間の間にいずれかのタイマー・メソッドを呼び出すと、そのタイマー・データはカレントです。 しかし、その満了期間の後、タイマーのキャッシュ・データは無効になり、実際にデータベース内に存在するデータを反映していない可能性があります。 この例で、1 時間半後にすべてのタイマーについて EJB コンテナーに照会を行うと、 アプリケーションは新しいタイマー・オブジェクトを入手しますが、それに含まれるキャッシュ・データは、その後 30 分間だけカレントになります。 これは、2 時間後になるとタイマーが再び満了し、キャッシュ・データが無効になるためです。
手順
例
- App1#EJBJar1.jar#EJBTimer1
- App2#EJBJar2.jar#EJBTimer2
- 例 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