Springのための宣言的キャッシングサービス
Pages: 1, 2, 3, 4

宣言的キャッシングサービスの動作

宣言的キャッシングサービスは、実行時のメソッドインターセプションを使用して、Springの管理下にあるBeanに対して、 透過的でコードフリーのキャッシングとキャッシュフラッシングを提供します。コンフィグレーションには、どのメソッドをインターセプトするかと、それらの メソッドに対してキャッシングサービスをどのように適用するかの選択が含まれているだけです。以下に、宣言的キャッシングサービスの動作の概要を簡単に説 明します。

図1のアティビティ図は、キャッシングメソッドインターセプタの動作を表しています。

キャッシングの動作
図1. キャッシングの動作

まず、キャッシングインターセプタは、インターセプトしたメソッドのシグネチャと、与えられたパラメータ値を使用して、一意のキーを生成します。次 に、インターセプタは、生成されたキーの下に保存されているオブジェクトをキャッシュ内で検索します。オブジェクトが見つかった場合は、それを直ちにクラ イアントに返します。インターセプトしたメソッドの実行は行いません。キャッシュ内に値が見つからなかった場合、インターセプタは、インターセプトしたメ ソッドを実行し、(生成されたキーを使用して)その戻り値をキャッシュに保存します。そして、キャッシュしたオブジェクトをクライアントに返します。 キャッシュエントリ用のキーは、プラグイン可能なキージェネレータによって自動生成されます。現在提供されている方法は、 HashCodeCacheKeyGeneratorのみです。このキージェネレータは、インターセプトしたメソッドと、そのパラメータのハッシュコードに基づいて一意のキーを生成します。キージェネレータは、 CacheKeyGeneratorインタフェースを実装することによって、簡単に作成できます。

図2のアティビティ図は、キャッシュフラッシングメソッドインターセプタの動作を表しています。

キャッシュフラッシングの動作
図2. キャッシュフラッシングの動作

キャッシュフラッシングメソッドインターセプタは、インターセプトしたメソッドを実行する前または後に、キャッシュをフラッシュするように設定できます。インターセプタが1つまたはいくつかのキャッシュ領域をフラッシュするか、キャッシュ全体をフラッシュするかは、インターセプタの設定と、使用されているキャッシュプロバイダによって決まります。

宣言的キャッシングサービスの設定

宣言的キャッシングサービスは、Spring 2.0のXMLネームスペースサポートに基づいて、簡潔でわかりやすいコンフィグレーションを提供しています。各キャッシュプロバイダは、それぞれ固有の ネームスペースを持ちます。このネームスペースは、Spring IoCコンテナのコンフィグレーションで宣言されている必要があります。以下の例は、 coherenceネームスペースを宣言する方法と、その場所を指定する方法を示しています。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   
                          
xmlns:coherence="http://www.springmodules.org/schema/coherence"

  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

        
                          
http://www.springmodules.org/schema/coherence http://www.springmodules.org/schema/cache/springmodules-tangosol.xsd">
                        

キャッシングサービスのターゲットとなるSpring Beanをセットアップする前に、キャッシングサービスの動作に影響を与える1組のシステム全体のコンフィグレーションを含める必要があります。それを以下に示します。

<coherence:config failQuietly="false" 

                  serializableFactory="XSTREAM" />

キャッシングは、透過的にアプリケーションのパフォーマンスを向上させるという主要な目標と直交関係にあります。キャッシング は、コアのビジネスロジックに影響を与えたり、アプリケーションの動作を変更させてはいけません。キャッシングに失敗しても、アプリケーションの実行を停 止することはできません。特に実運用環境ではそうです。一方、不具合の程度に関わらず、キャッシングのエラーを含むどんな不具合に対しても、アプリケー ションを停止したい場合があります。たとえば、開発途中の統合テストを実行している場合は、アプリケーションを実運用環境に配置する前に、どんなコンフィグレーションエラーも見つけておかなければなりません。

failQuietly プロパティを利用すると、開発者は、キャッシングエラーによってアプリケーションの実行を停止するかどうかを決定できます。このプロパティを trueに設定すると、どんなキャッシングエラーが発生しても、アプリケーションには全く影響を与えません。このプロパティのデフォルト値は falseです。

キャッシングが一旦開始されると、キャッシュしたオブジェクトをファイルシステムに保存したり、クラスタ内のノードを越えてキャッシュ内の変更を複 製する必要があるケースを見つけます。キャッシュプロバイダは、Javaのシリアライゼーションを利用して、これらの機能を実行します。これは、キャッ シュに保存すべきオブジェクトは、 java.io.Serializableインタフェースを実装していなければならないことを意味しています。

このような要件があるため、シリアライズできず、制御できないオブジェクト(たとえば、JAXBによって生成されたオブジェクト)をキャッシュに保存する必要がある場合に問題が発生します。 serializableFactory プロパティは、シリアライズできないオブジェクトを強制的にシリアライズすることによって、この問題を解決します。シリアライズの方法として提供されているのは、 XStreamSerializableFactoryのみです。これは、オブジェクトをキャッシュに保存する前に、 XStreamを使用してオブジェクトをXMLにシリアライズします。この記事が公開される頃には、 JBoss Serializationを使用した新しい方法も提供される予定です。

オブジェクトを強制的にシリアライズする別の方法としては、AspectJのインタータイプ宣言を使用して、クラスに java.io.Serializableを実装させる方法があります。以下の例は、 Customerクラスがシリアライズできないときに、それをクラスタ化されたキャッシュに保存する必要がある場合を仮定しています。

public aspect SerializationAspect {

  declare parents : Customer implements java.io.Serializable;

}

インタータイプ宣言やAspectJ全般についての詳細は、 AspectJドキュメントを参照してください。

宣言的キャッシングサービスは、開発者が、アプリケーションのニーズに合わせて最適な方法を選択できるように、様々なコンフィグレーション方法を提供しています。以降のセクションでは、提供されているコンフィグレーション方法についてそれぞれ説明していきます。

Pages: 1, 2, 3, 4

Next Page »