Ehcacheとは?

Ehcacheは米TerracottaによるオープンソースのキャッシュライブラリでApache License, Version 2.0の下で提供されている。豊富な機能が提供されており、Javaのキャッシュライブラリとしての定番として広く利用されている。JMXによるモニタリングや、Terracottaによるレプリケーション、RESTやSOAP経由でキャッシュサーバとしての利用も可能など、非常に高機能だ。

Ehcacheの本稿執筆時点の最新の安定板は2.0.1となっている。本稿ではこのバージョンをもとにEhcacheの基本的な利用方法を紹介する。また、最近リリースされたEhcache 2.1.0-betaの新機能についても簡単に紹介する。

Ehcacheを使ってみよう

Ehcacheを利用するにはクラスパスルートにehcache.xmlという設定ファイルを配置しておく必要がある。ここでは最も簡単な設定例を示す。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <diskStore path="java.io.tmpdir"/>

  <defaultCache
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    overflowToDisk="true" />

  <cache name="sampleCache1"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    overflowToDisk="true" />
</ehcache>

キャッシュに関する設定項目には以下のようなものがある。ehcache.xmlではこのほかにもクラスタリングやトランザクションなどさまざまな設定が可能だ。詳細な設定内容についてはEhcacheのWebサイトにコメント付きの設定ファイルのサンプルが用意されているので参照してほしい。

キャッシュの設定項目

設定項目 説明
maxElementsInMemory メモリに格納する最大エントリ数、0の場合は無制限
eternal trueを指定した場合タイムアウト値は無視される
timeToIdleSeconds キャッシュのアイドル秒数を指定、0の場合は無制限(デフォルトは0)
timeToLiveSeconds キャッシュの有効秒数を指定、0の場合は無制限(デフォルトは0)
overflowToDisk メモリへの格納数をこえた場合にディスクに格納するかどうかをtrueまたはfalseで指定
diskSpoolBufferSizeMB ディスクキャッシュのスプールバッファとして割り当てるメモリ量を指定(デフォルトは30MB)
clearOnFlush flush()メソッドが呼び出されたときにメモリキャッシュをクリアするかどうかをtrueまたはfalseで指定
copyOnRead flush()メソッドが呼び出されたときにメモリキャッシュをクリアするかどうかをtrueまたはfalseで指定
clearOnFlush 読み取り時にキャッシュ要素をコピーするかどうかをtrueまたはfalseで指定(デフォルトはfalse)
clearOnFlush flush()メソッドが呼び出されたときにメモリキャッシュをクリアするかどうかをtrueまたはfalseで指定
copyOnWrite 書き込み時にキャッシュ要素をコピーするかどうかをtrueまたはfalseで指定(デフォルトはfalse)
maxElementsOnDisk ディスクに格納する最大エントリ数、0の場合は無制限(デフォルトは0)
diskPersistent VMを再起動する際にディスクキャッシュを永続化するかどうかをtrueまたはfalseで指定(デフォルトはfalse)
diskExpiryThreadIntervalSeconds ディスクキャッシュの期限をチェックするスレッドの走行感覚を秒数単位で指定(デフォルトは120秒)
memoryStoreEvictionPolicy メモリに格納するエントリが最大値に達したときの振る舞いをLRU、FIFO、LFUのいずれかで指定(デフォルトはLFU)
statistics 統計情報を取得するかどうかをtrueまたはfalseで指定(デフォルトはfalse)

キャッシュに値を格納、取得、削除を行うコードは以下のようになる。ehcache.xmlで定義したsampleCache1というキャッシュに対して操作を行っている。キャッシュには任意のオブジェクトを格納できるが、シリアライズが不可能なオブジェクトについてはディスクキャッシュやレプリケーションといった機能が利用できないので注意が必要だ。

CacheManager manager = CacheManager.getInstance();

try {
  Cache cache = manager.getCache("sampleCache1");
  {
    // キャッシュに値を格納
    Element element = new Element("key1", "value1");
    cache.put(element);
  }
  {
    // キャッシュから値を取得
    Element element = cache.get("key1");
    String value = (String) element.getValue();
    System.out.println(value);
  }
  {
    // キーを指定してキャッシュを削除
    cache.remove("key1");
    // キャッシュ内のすべてのエントリを削除
    cache.removeAll();
  }

} finally {
  manager.shutdown();
}

Ehcache 2.1.0-betaの新機能

2010年4月22日(現地時間)、Ehcacheの最新のベータ版となるEhcache 2.1.0-betaがリリースされた。

Ehcache 2.1.0-betaの新機能として、スタンドアロンの利用においてもJTA(Java Transaction API)がサポートされるようになったという点が挙げられる。JTAはJavaアプリケーションにおいて分散トランザクションを制御するためのAPIで、Hibernate向けのJTAサポートが追加されたことで、EhcacheをHibernateの2次キャッシュとして使用する際にtransactional戦略を選択することができるようになった。

また、新たなモジュールとしてehcache-nonstopcacheモジュールehcache-unlockedreadsviewモジュールのベータ版も利用可能となっている。

ehcache-nonstopcacheモジュールはTerracottaで分散されたキャッシュに、可用性に関する追加機能を提供するモジュールで、キャッシュ操作におけるタイムアウトや、クラスタ切断時のカスタムアクションといった新たなAPIを提供する。ehcache-unlockedreadsviewモジュールは一貫性は担保しないもののロック不要なビューを提供することでキャッシュの読み取り処理の高速化を実現するものだ。

なお、Ehcache 2.1.0-betaのディストリビューションにはTerracottaサーバも含まれており、分散キャッシュを構築するためにはEhcacheとTerracottaサーバを統合して利用することが推奨されている。また、アプリケーションの開発時にTerracottaサーバを開発環境に統合するためのMavenプラグインが提供されている。