Javaでキャッシュを実現するためのライブラリとして、Apache JakartaプロジェクトのJCS(Java Caching System)があります。Java言語を用いたWEBアプリケーションやスタンドアロンシステムで使えそうなので、簡単なサンプルプログラムを作成してみました。
JCSの概要については、下記URLに解説記事がありました。
http://www.ibm.com/developerworks/jp/java/library/j-jcs.html
JCSはこちらからダウンロードできます。
http://commons.apache.org/jcs/DownloadPage.html
依存するライブラリとして、concurrentパッケージが必要です。
http://g.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
サンプルですが、まず、JCSの構成ファイル(cache.ccf)を作成して実行時のカレントディレクトリに配置します。まずは基本的な構成として、純粋にメモリーを利用してキャッシュを構成してみました。
# DEFAULT CACHE REGION
jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=10
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
MaxObjectsにオブジェクト最大保持数を指定します。ここではテストのため、10を設定しました。
実際に簡単なオブジェクトを11個キャッシュに保存して、どうなるか試してみました。実行すると、古いキャッシュから2個が消えていました。つまりオブジェクト最大保持数-1個のオブジェクトがキャッシュに保存されている、ということになりそうです。キャッシュを見てなければファイルやDBから取得する、という使い方ができそうです。
以下、サンプルソースと実行結果です。
------ サンプルソース ------
package com.hcc_soft.geo.test;
import java.io.Serializable;
import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;
public class JCSTest {
// キャッシュ領域名
private static final String CACHE_REGION_NAME = "hcc";
// キャッシュオブジェクト
private JCS cache = null;
public void test() {
try {
// キャッシュ初期化
setCache(JCS.getInstance(CACHE_REGION_NAME));
// 11人分のオブジェクトをキャッシュに入れる
for(int i = 0; i < 11; i++) {
Person person = new Person("大川"+(i+1), "栃木", "000-0000");
cache.put("ohkawa"+(i+1), person);
}
// 11人分のオブジェクトをキャッシュから読む
for(int i = 0; i < 11; i++) {
Person person1 = (Person)cache.get("ohkawa"+(i+1));
System.out.println(person1 == null? "null":person1.toString());
}
} catch (CacheException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
JCSTest s = new JCSTest();
s.test();
}
public JCS getCache() {
return cache;
}
public void setCache(JCS cache) {
this.cache = cache;
}
protected class Person implements Serializable {
protected String name_;
protected String address_;
protected String phone_;
public Person(String name, String address, String phone) {
name_ = name;
address_ = address;
phone_ = phone;
}
public String toString() {
return "名前:"+name_+" 住所:"+address_+" 電話番号:"+phone_;
}
}
}
------ 実行結果 ------
null ←古くて消えたキャッシュ
null ←古くて消えたキャッシュ
名前:大川3 住所:栃木 電話番号:000-0000
名前:大川4 住所:栃木 電話番号:000-0000
名前:大川5 住所:栃木 電話番号:000-0000
名前:大川6 住所:栃木 電話番号:000-0000
名前:大川7 住所:栃木 電話番号:000-0000
名前:大川8 住所:栃木 電話番号:000-0000
名前:大川9 住所:栃木 電話番号:000-0000
名前:大川10 住所:栃木 電話番号:000-0000
名前:大川11 住所:栃木 電話番号:000-0000