我看到 anorm 不是 ORM 框架,它是通过 SQL 直接查询数据。对于大多数应用程序/网站,我们不应该每次都查询数据库,我们需要通过 SQL 或 item id 缓存数据。我想知道 playframework 是否提供了任何类型的缓存机制?如果没有怎么添加呢?
谢谢。
我看到 anorm 不是 ORM 框架,它是通过 SQL 直接查询数据。对于大多数应用程序/网站,我们不应该每次都查询数据库,我们需要通过 SQL 或 item 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
。如果该值在缓存中,它将被检索并且不会执行任何查询。
唯一的问题是,当您更新实体用户时,您必须更新缓存(因此它不会保留过时的数据):
// 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)