Play 2.0 の Cache API が使うに耐えない


Play 2.0(厳密にはこの記事の執筆時の最新 2.0.3)の Cache API はほんとうに使うに耐えません(Scala での話。Java ではどうだか試してません)。Ehcache を直で扱ったほうがよっぽどよさそうです。

1. キャッシュを削除できない。

キャッシュってそんなに任意で消すようなものでもないと思いますが、それにしても任意に消せないのはどうも不便です。ちなみに以下のようなコードがキャッシュを消すコードとして一部で出回っていますがデタラメです。null 値が永遠にキャッシュされるだけです。

Cache.set("YourCacheKey", null, 0)

2. キャッシュの寿命のデフォルト値を制御できない。

現在の実装では、キャッシュの寿命を指定しないと 0 を指定したことになります。0 を指定すると永遠にキャッシュするという意味になります。設定ファイルなどで調整できません。

3. null 値をキャッシュできない(取り出せない)。

null をキャッシュする意味があるのかというと、たまにあります。非常に長い処理の結果が null だったりしたら null も重要な情報のひとつです。Scala なら None 使えよって話もありますが。

それで、null 値をキャッシュに入れることはできるのです。ところが取り出そうとすると NullPointerException で落ちます。なので、前述のデタラメキャッシュ削除コードを使っていたりすると潜在バグの温床になります。NullPointerException が出ること自体 Play のバグのような気もしますが……。

  1. とおりすがり

    PlayのCacheAPIがnull値を設定できないのは、
    cache pluginを通じて外部のKVSへ保存する仕組みになってるからだと思います。
    だからSerializableなデータ以外を保存するという考え方はしてはいけないのだと思います。
    Ehcache pluginは実装次第でnull保存できるかもですが、
    Ehcacheだけ特別扱いしては、plugin式にしてAPIでキャッシュの動作を隠蔽している意味が…

    (他のcacheプラグインはSerializable以外を受けると例外出ます。)

    cacheAPI自体の問題としては、
    インターフェイス的にSerializableを受けるようになってないって事がバグなんじゃないかと思います。

Leave a Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください