OSCacheを使ってみる

  • 概要

JSP Caching
カスタムタグを使ってレンダリングされたJSP(カスタムタグで指定した部分、ページ全体をキャッシュしたい場合は2の方法を使う)をキャッシュする
Request Caching
サーブレットフィルタを使って HTTP のレスポンスをキャッシュする(自動生成された画像やPDF等のバイナリも可)
General-Purpose Cache
OSCache の API を直接使用してオブジェクトをキャッシュする。

  • キャッシュ先

メモリとディスクにキャッシュを保持できる模様(両方の組み合わせも可)。ディスクはサーバが落ちたときやメモリから溢れたときに有用。また、キャッシュのクラスタリングもできる模様。

LRU (Least Recently Used)
FIFO (First In First Out)
Unlimited
独自のアルゴリズムを追加することも可能。

1.ダウンロード:https://oscache.dev.java.net/servlets/ProjectDocumentList
2.DLしたファイル(oscache-2.1-full.zip)を解凍し、oscache.jar を /WEB-INF/lib にコピー
3.commons-logging.jar が必要なようなので /WEB-INF/lib になければこれもコピーする
(lib/core にjarに置いてある)
4.JDK 1.3.x使ってる場合は、commons-collections.jar を /WEB-INF/lib に入れときなさい、とのこと。
JDK 1.4以降であればそっちの方が(今のところ)早いので必要ないらしい(あっても中でJDKのバージョンを判断してるので特に気にする必要はない)。
5.設定ファイル src/oscache.properties を /WEB-INF/classes に置く
6.src/META-INF/taglib.tld を /WEB-INF/classes に置く(置き場は環境によるかな)
7.ってことでここまででこんな感じになってるでしょ、ってところ

$WEB_APPLICATION/WEB-INF/lib/oscache.jar
$WEB_APPLICATION/WEB-INF/classes/oscache.properties
$WEB_APPLICATION/WEB-INF/classes/taglib.tld

8.でもって、


    oscache
    /WEB-INF/classes/taglib.tld

として、あとはJSPにTagでキャッシュの設定をするなり、サーブレットフィルタでページごとキャッシュしたりすればいいじゃない、とのこと。


JSPとかフィルタが一押しなのか、ドキュメントにはそこら辺しか書いてない。それ以外のインスタンスのキャッシュとかの方法はAPIドキュメント見ないといけない。こっちの方が主に知りたいんだけどなぁ。

サーブレットフィルタを使ってページを丸ごとキャッシュする。例えば全てのJSPのページをキャッシュしたい場合は web.xml にこんな感じでフィルタを設定する。


    CacheFilter
    com.opensymphony.oscache.web.filter.CacheFilter


    CacheFilter
    *.jsp

デフォルトではキャッシュ保持期間は1時間で、application スコープに保持しているようなので、必要に応じて初期化パラメータで変更する(scope に指定できるのは application または session、て当たり前だわな)。


    CacheFilter
    com.opensymphony.oscache.web.filter.CacheFilter
    
       time
       600
    
    
       scope
       session
    

上の設定ではキャッシュ保持期間は10分で session スコープに保持する。ちなみにステータス 200(HttpServletResponse.SC_OK)だったコンテンツのみキャッシュする模様。

・cache.memory(true or false)
メモリキャッシュを使用するかどうか。デフォルトはtrue。
・cache.capacity
キャッシュに保持できるアイテムの数。デフォルトはunlimited。
・cache.algorithm
キャッシュアルゴリズムを指定する。
 ・com.opensymphony.oscache.base.algorithm.LRUCache
 ・com.opensymphony.oscache.base.algorithm.FIFOCache
 ・com.opensymphony.oscache.base.algorithm.UnlimitedCache
:LRUCache/FIFOCache は cache.capacity が指定されていないと有効にならないし、cache.capacity が指定されていない場合、UnlimitedCache がデフォルトとなる。
・cache.persistence.class
キャッシュを永続化するために使用するクラス。デフォルトでファイルシステムに永続化する HashDiskPersistenceListener が提供されている(cache.path にキャッシュを保存するディレクトリを指定する必要有)。
・cache.persistence.overflow.only
キャッシュを永続化するタイミング。デフォルトは false となっており、メモリの保持サイズに達した場合のみ永続化する。キャッシュサイズの指定をしている場合は、true にすることを推奨している。
・cache.key
ServletCacheAdministrator が application/session スコープにキャッシュを保持するためのキー。デフォルトは、"__oscache_cache"。コードから直接キーを扱う場合、デフォルトのキーは com.opensymphony.oscache.base.Const.DEFAULT_CACHE_KEY で定義されている模様。

保留…GeneralCacheAdministrator の JavaDoc を見るべし。

v2.0からの新機能らしいが、きっと使うことはない…