繁体   English   中英

如何在Playframework中使用anorm时添加缓存机制

[英]How to add cache mechanism when using anorm in Playframework

我看到anorm不是一个ORM框架,它直接通过SQL查询数据。 对于大多数应用程序/网站,我们不应该每次都查询数据库,我们需要通过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)
      }
    }
}

代码执行选择并通过getOrElse将答案存储在缓存中。 如果该值在Cache中,则将被识别并且不会执行任何查询。

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

// 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM