メソッドコールキャッシュの実装その2
キャッシュマネージメントについては、自分で作るのもバカらしいので以下のものを候補に上げておき、実装レイヤを分離できるようにするのがよさげだ。
とりあえずehCacheで作ってみよう。
この手のキャッシュフレームワーク?ライブラリ?は設定ファイルでキャッシュの設定を変えられる。ディスクへの永続化なんかもサポートしている。そして、これらの機能の要件に「キャッシュ対象はSerializableであること」というのが含まれている。ま、これは元々そのつもりだからいいのか。
呼び出しのキャッシュをする際に、
- "どのオブジェクトに対する呼び出しか"をキャッシュのキーとする
- そもそも1オブジェクトに対して1キャッシュしか用いないようにして、対象オブジェクトはキーには含めない
ということのどちらかを達成しないといけない。後者は安直だが使いにくさupしそうだ(それでも ServiceやDaoやsingletonであることが多い(はず)ので、基本的なシーンでは問題ないのかもしれない)。
とりあえず、前者について考えてみる。
- キーに含めるのでこの情報もSerializableでないといけない…
- 対象オブジェクトへの参照そのものを持つ方式では対象オブジェクト自体をシリアライズしてしまい本末転倒。というか使いにくい。
- SoftReferenceその他はシリアライズ不可能
- hashCode()、もしくはSystem.identityHashCode()を使う?
- a.equals(b)の場合に a.hashCode()==b.hashCode()であることはルール
- しかし、a.hashCode()==b.hashCode()のときに equalsとは限らないことになっている(当たり前)
- よって…理屈上はこいつに同一性/同質性の判断を託すわけにはいかん
うーん。ダメか。やはり 1オブジェクト 1キャッシュを運用面で達成する、という切り口のほうが無難か。
それにしてもキーがSerializableじゃないといけない、というのもなんだか。キャッシュ全体のパーシステンスのためか。ehCacheの中を調べてみたほうがいいか?
とりあえず試作品は完成したが上記のことが納得いかないので継続調査。