5

我看到 anorm 不是 ORM 框架,它是通过 SQL 直接查询数据。对于大多数应用程序/网站,我们不应该每次都查询数据库,我们需要通过 SQL 或 item id 缓存数据。我想知道 playframework 是否提供了任何类型的缓存机制?如果没有怎么添加呢?

谢谢。

4

3 回答 3

10

在查询数据库之前,您可以在控制器中使用 Play 缓存。下面是一个从Play 缓存文档Scala API派生的简单示例:

val user: User = Cache.getOrElse[User](key = "user" + userId, expiration = 10) {
  User.findById(userId)
}

在这段代码中,在尝试查询数据库之前,我们在缓存中进行查找以检查之前是否未加载用户。如果在缓存中找不到,我们将其存储在缓存中,并在 10 秒内过期。

于 2012-11-27T10:06:24.883 回答
6

您可以简单地缓存 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。如果该值在缓存中,它将被检索并且不会执行任何查询。

唯一的问题是,当您更新实体用户时,您必须更新缓存(因此它不会保留过时的数据):

// 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)
于 2012-11-27T10:13:02.263 回答
0

假设您使用的是 Play2 框架,它确实提供了缓存机制。它在这里有很好的文档:

http://www.playframework.org/documentation/2.0/JavaCache(它被称为 javacache,但它适用于 Scala)

于 2012-11-27T08:09:59.247 回答