EHCache

少し古い情報かもしれません。

キャッシュを作成する

CacheManager manager = CacheManager.getInstance();
 
// キャッシュの作成
Cache cache = manager.getCache("sampleCache1"); // "sampleCache1"はehcache.xmlで定義したキャッシュ設定
 
// エレメントの作成
Element elm = new Element("key1","value1");
cache.put(elm); // キャッシュへエレメントを追加
 
// キャッシュからエレメントを取得
Element pElement = cache.get("key1");
 
// キャッシュから任意にエレメントを削除
cache.remove("key1");

シリアライズなオブジェクトと非シリアライズオブジェクトのキャッシュ

EHCacheはシリアライズなオブジェクトと非シリアライズオブジェクトのいずれもキャッシュに格納することができます。
ただし、非シリアライズオブジェクトはディスクキャッシュに格納されることはありません。

非シリアライズオブジェクトは実際には参照によってキャッシュに格納されたオブジェクトと、キャッシュ元のオブジェクトとが同じデータを指しているので注意が必要です。

// オブジェクトのキャッシュ
MyData rawMyData = new MyData();
rawMyData.name = "リオル";
 
//キャッシュへ
Element elm2 = new Element("key2",rawMyData);
cache.put(elm2);
 
// キャッシュから取得
Element elm2g = cache.get("key2");
MyData cacheRawMyData = (MyData)elm2g.getObjectValue(); // 非シリアライズオブジェクト用
 
System.out.println("cached = " + cacheRawMyData.name ); // echo "リオル"
 
rawMyData.name = "ルカリオ";
 
MyData cacheRawMyData2 = (MyData)elm2g.getObjectValue(); // 非シリアライズオブジェクト用
System.out.println("cached2 = " + cacheRawMyData2.name ); // echo "ルカリオ"

カスタムクラスのシリアライズクラス化

任意のクラスをEHCacheにシリアライズ可能クラスとして使用することは非常に単純です。
任意のクラス定義の際に、Serializableインターフェースをインプリメントすればよいだけです。

EHCacheはこれだけでオブジェクトがシリアライズ可能クラスのオブジェクトであると判断します。
ただし、そのオブジェクトが持つデータメンバも含めて本当に直列化されているかはプログラマに任されます。
たとえSerializableインターフェースがインプリメントされていても、そのクラスがデータの参照を含むことの無いように気をつける必要があります。

キャッシュされたオブジェクトの取得

キャッシュからオブジェクトを取得するには2種類のメソッドが定義されています。

getValue()
キャッシュされたオブジェクトがシリアライズ可能なオブジェクトの場合。
getObjectValue()
キャッシュされたオブジェクトがシリアライズ不可能なオブジェクトの場合。
Cache cache = manager.getCache("sampleClass");
 
String rawData = "ムクバード";
Element element = new Element("key", rawData);
cache.put(element);
 
// シリアライズ可能クラスの場合、
// どちらのメソッドでも取得可能です。
Element elmGet = cache.get("key");
String cv = (String)elmGet.getValue();
String crawv = (String)elmGet.getObjectValue();
 
 
MyData mydata = new MyData();
Element element2 = new Element("key2", myData);
cache.put(element2);
 
// MyDataが、非Serializableクラスである場合、
// getValue()の呼び出しで失敗する。
Element elm2g = cache.get("key2");
MyData cacheMyData = (MyData)elm2g.getValue(); // CacheException例外がスローされる。
MyData cacheRawMyData = (MyData)elm2g.getObjectValue();

キャッシュの有効期限

キャッシュされたエレメントの有効期限はEHCacheの設定ファイルによって設定されます。
たとえば、timeToIdleSecondsが「10」を設定してあるキャッシュを使用した場合、エレメントへのアクセスが10秒間無ければそのキャッシュは破棄されることを意味します。

CacheManager manager = CacheManager.getInstance();
Cache cache = manager.getCache("sampleClass");
 
MyData mydata = new MyData();
Element element2 = new Element("key2", myData);
cache.put(element2);
 
Thread.sleep(1000 * 15); // 15秒 Sleep(timeToIdleSeconds=10の場合)
 
Element elm3g = cache.get("key2"); // nullが返される

サーブレットのキャッシュ

TomcatなどのAPサーバーでリクエスト結果のHTMLをキャッシュさせることで、ブラウザへのレスポンスを高速に行うことができる。

EHCacheには標準でTomcatのフィルタとして使用できるキャッシュフィルタ「SimplePageCachingFilter」が用意されています。
このフィルタを使ってレスポンスをキャッシュするには「web.xml」に次のようにフィルタを適用します。

<!-- Caching (using EHCache) -->
<filter>
	<filter-name>cachingFilter</filter-name>
	<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>cachingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

SimplePageCachingFilterはキャッシュ設定として「SimplePageCachingFilter」というキャッシュ名を使用しています。
ehcache.xmlにこの名前のキャッシュが定義されていない場合、サーブレットは起動せずエラーとなります。

たとえば、下記のようなキャッシュ設定をehcache.xmlに記述するとよいでしょう。

<cache name="SimplePageCachingFilter"
	maxElementsInMemory="10000"
	eternal="false"
	timeToIdleSeconds="300"
	timeToLiveSeconds="600"
	overflowToDisk="true" />

設定

EHcacheの設定はehcache.xmlをつかって行います。

diskStore

ディスクキャッシュで作成するキャッシュファイルの場所を指定します。

下記のいずれかを設定できます。

設定値 説明
java.io.tmpdir デフォルトの一時ディレクトリ。(結局どこだろう?)
user.home ユーザーのホームディレクトリ
user.dir ユーザーのカレントディレクトリ

defaultCache/cache

defaultCacheはデフォルトのキャッシュです。
CacheManagerをつかってキャッシュを作成する際に、使用するキャッシュ定義名を何も指定しなかった場合に使用されるキャッシュ情報です。

cacheはキャッシュ設定を任意のキャッシュ定義名で定義することができます。
ここで設定した定義名は、Javaからキャッシュを作成する際に指定することで任意のキャッシュ設定を使うことができます。

キャッシュ設定項目

defaultCacheやcacheに対して属性に記述することができるキャッシュに関する設定項目です。

<cache name="sampleDistributedCache1"
       maxElementsInMemory="10"
       eternal="false"
       timeToIdleSeconds="100"
       timeToLiveSeconds="100"
       overflowToDisk="false">
</cache>
フィールド名 説明
name キャッシュ設定の定義名
eternal キャッシュされたエレメントがタイムアウトによって解放されるか設定します。「true」に設定するとタイムアウトによってエレメントはキャッシュから解放されません
maxElementsInMemory メモリ上に格納されるキャッシュのオブジェクトの最大数を設定します。
maxElementsOnDisk ディスク上に格納されるキャッシュのオブジェクトの最大数を設定します。通常、この値は「0」を設定し無制限にキャッシュを保存します。
overflowToDisk メモリー上のキャッシュサイズがmaxElementsInMemoryまで達した場合、エレメントをディスクにオーバーフローすることを許可する場合「true」を設定します。
timeToIdleSeconds エレメントが期限切れになるまでのアイドル時間を設定します。「external=true」の場合は期限切れになることは無いので実質この値は使われないことを意味します。
timeToLiveSeconds
memoryStoreEvictionPolicy EHCacheがキャッシュの作成を行う際の戦略

定義ファイルサンプル

ehcache.xsdは自分で用意しプロジェクトに追加します。ehcache.xsdの配置はソースフォルダ内に配置します。
ehcache.xsdの中身はオフィシャルドキュメント内にありますのでそれをコピーしてきます。

ただし、ehcache.xsdは必須ではありません。
このファイルを用意すると下記のようにスキームの正当性の検証をエディタなどによって行わせることができるので記述ミスがなくなります。
スキーム定義情報を使わない場合は下記のXMLからスキームの参照に関する記述を削除して使ってください。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd">
	<diskStore path="java.io.tmpdir" />
 
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
	<cache name="my.package.Class" maxElementsInMemory="10000"
		eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"
		overflowToDisk="true" />
 
</ehcache>

キャッシュ設定のサンプル

公式サイトに掲載されているものです。

<!--
"sampleCache1"というサンプルキャッシュ
 
メモリ上に最大で10000のエレメントが格納可能で、この中のエレメントに5分間使用されないか、
10分以上使用されているエレメントに対してはキャッシュからエレメントを解放します。
 
10000を越えるエレメントがキャッシュされようとしている場合、、ディスクキャッシュへのオーバーフローを行います。
ディスクキャッシュは「java.io.tmp」に作成されます。(標準Linuxシステムの場合"/tmp"になる)
-->
<cache name="sampleCache1"
       maxElementsInMemory="10000"
       maxElementsOnDisk="1000"
       eternal="false"
       overflowToDisk="true"
       timeToIdleSeconds="300"
       timeToLiveSeconds="600"
       memoryStoreEvictionPolicy="LFU"
/>
最終更新:2011年01月25日 20:32
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。