少し古い情報かもしれません。
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種類のメソッドが定義されています。
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をつかって行います。
ディスクキャッシュで作成するキャッシュファイルの場所を指定します。
下記のいずれかを設定できます。
| 設定値 | 説明 |
| java.io.tmpdir | デフォルトの一時ディレクトリ。(結局どこだろう?) |
| user.home | ユーザーのホームディレクトリ |
| user.dir | ユーザーのカレントディレクトリ |
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"
/>