Как добавить механизм кэширования при использовании anorm в Playframework

Я вижу, что anorm не является платформой ORM, она запрашивает данные напрямую через SQL. Для большинства приложений / веб-сайтов нам не следует каждый раз запрашивать базу данных, нам нужно кэшировать данные либо по SQL, либо по идентификатору элемента. Интересно, предоставил ли playframework какой-либо механизм кэширования? Если не как добавить?

Благодарю.

3 ответа

Решение

Вы можете использовать кэш 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, оно будет извлечено и запрос не будет выполнен.

Единственная проблема заключается в том, что когда вы обновляете сущность 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)

Другие вопросы по тегам