anormはORMフレームワークではなく、SQLによって直接データをクエリしているようです。ほとんどのアプリケーション/Webサイトでは、毎回データベースにクエリを実行する必要はありません。SQLまたはアイテムIDのいずれかでデータをキャッシュする必要があります。PlayFrameworkが何らかのキャッシュメカニズムを提供しているかどうか疑問に思いますか?それを追加する方法がない場合は?
ありがとう。
anormはORMフレームワークではなく、SQLによって直接データをクエリしているようです。ほとんどのアプリケーション/Webサイトでは、毎回データベースにクエリを実行する必要はありません。SQLまたはアイテムIDのいずれかでデータをキャッシュする必要があります。PlayFrameworkが何らかのキャッシュメカニズムを提供しているかどうか疑問に思いますか?それを追加する方法がない場合は?
ありがとう。
データベースにクエリを実行する前に、コントローラで Play キャッシュを使用できます。Play キャッシュのドキュメントとScala APIから派生した簡単な例を次に示します。
val user: User = Cache.getOrElse[User](key = "user" + userId, expiration = 10) {
User.findById(userId)
}
このコードでは、データベースにクエリを実行する前に、キャッシュ内でルックアップを行い、ユーザーが以前に読み込まれていないかどうかを確認します。キャッシュに見つからない場合は、10 秒で有効期限が切れるキャッシュに保存します。
Anorm メソッドの答えを単純にキャッシュすることができます。たとえば、私が使用する実際の方法:
def findById(id: Long): Option[User] = {
Cache.getOrElse(userCacheKey + id, 60*60) {
DB.withConnection {
implicit connection =>
SQL("select * from publisher where id = {id}").on('id -> id).as(User.simple.singleOpt)
}
}
}
コードは Select を実行し、 を介してキャッシュに回答を保存しますgetOrElse
。値がキャッシュにある場合は取得され、クエリは実行されません。
唯一の問題は、エンティティ User を更新するときにキャッシュを更新する必要があることです (そのため、古いデータは保持されません)。
// Assumes a user: User object available with the updated user
Cache.set(userCacheKey + id, cached.copy(name = user.name, avatar = user.avatar, bio = user.bio, url = user.url, location = user.location), 60*60)
Play2フレームワークを使用していると仮定すると、実際にキャッシュメカニズムが提供されます。ここに素晴らしいドキュメントがあります:
http://www.playframework.org/documentation/2.0/JavaCache(javacacheと呼ばれますが、Scalaから機能します)