Как добавить механизм кэширования при использовании 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)