普通はキャッシュにヒットしなければDBなりから取ってくるようになってそうだけど、そうじゃないケースに遭遇すると開発時にちょっと困るので、conf/ehcache.xml にキャッシュの設定を置くことでリロード時にファイルにストアしたり戻したりしてもらうことにする。
設定はこんな感じ。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false">
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
diskPersistent を true に設定しています。これでキャッシュがシリアライズされてファイル出力されるようになるので、サーバがリロードされてもキャッシュが残ってくれます。
というわけで実際に試してみましょう。下記のような簡易な
package controllers
import play.api.mvc.Controller
import play.api.mvc.Action
import play.api.cache.Cache
import play.api.Play.current
object Application extends Controller {
def set = Action {
Cache.set("key", "foo", 3600)
Ok("cache set")
}
def get = Action {
Ok( Cache.get("key").toString )
}
}
set を実行してから get を実行すると、下図のように値が表示されます。

ここでコードの中に適当に println とかを書き加えてから、再度 get にリクエストすると、コンパイルが実行され、アプリがリロードされてキャッシュが消え、None が返ります。

では、 conf/ehcache.xml というファイルを作成して、上述のXMLの内容を 貼りつけた上で、サーバを再度 play run で立ち上げてみます。
立ち上がったら、 set 側にアクセスしてキャッシュを設定し、 get 側にリクエスト。キャッシュが設定されていることを確認後、適当にControllerクラスのコードをいじってリコンパイルを走らせつつ get にリクエストすると、下記のようにちゃんと値が取れます。

ちなみにここで独自に作ったクラスをキャッシュに入れてみたら、EHCACHEがファイルからデシリアライズするタイミングで独自クラスが見つけられず、例外が起きて取得できなくなりました。
ClassLoader をゴニョゴニョすればなんとかできるけど、キャッシュシステム変えた時のこと等を考えて大人しくそうしたものは入れないようにする。