JavaでキャッシュをMap、memcached、ejb3とかで
Javaでナイスな感じのキャッシュの仕組みがほしい。
- 同一アプリサーバー内の複数のWebアプリでキャッシュを共有したい。
- ほとんどパフォーマンスを落とさないならクラスタ間でもキャッシュ共有したいけど、とりあえずクラスタ間の共有はなくてもよい。
- できればアプリサーバーはTomcatで
で、探す。
(イントロダクション読んで)なんとなく却下。まったく試してない。
サンプル試したりしたけど、なんかスケールがでかすぎる。たかがキャッシュごときに。却下。時間ある時にきちんと勉強してみたい。
思ったより全然パフォーマンスいい感じなので、候補。
ここで、
Ejb3でキャッシュの仕組みを作ったらどうだろ?と思った。
で、できた。
動かしてみる。
簡単な測定をしてみるとHashMapと比較して、2桁nano秒遅い。
memcachedより、1桁nano秒遅い。
意外な結果だと思ってたら、Remoteインターフェースだった事に気がつく。
ローカルインターフェースに修正する事にする。
で、直った。
動かしてみる。
エラー。
エラーメッセージが意味不明。
ググる。
たぶん「ejb3のローカル参照って同じear内でしか参照できない(←たぶん)」って事という結論に至る。
前にJBossでejb3のローカル参照やった時は同一サーバー内のアプリからローカル参照使えたからそれが普通だと思っていたけど、多分Jbossだけなんだろう。
UCLだったかなんかそんなんが関係してくるのかなー。
と思いながら、面倒くさいのでどうでも良しとする。
でも、やっぱりローカル参照のパフォーマンスを試したい。
で、JBossで試す事にする。
動かしてみた。
超速い。
てか、HashMapとほとんど変わらない。
JBoss上だと、なぜかHashMapが結構遅くなっているのが気になるけど。
それでも、ローカル参照のキャッシュは超速い。
どっちにしても、いろいろあってJBossは選択肢から外す。却下。
で、memcachedで決まりかなーと思い始める。
もう一回測定してみる事にする。
で、気がつく
データが小さい時はパフォーマンス良いけど、データが大きくなってくるとパフォーマンスが落ちてくる。
Ejb3(リモート)だとそんなに変化ない。
データがそこそこ大きくなると、memcachedの方がejb3よりも遅くなっている。
考える。