Изпробвам кеширане в моето приложение за игра и изглежда, че работи, но кодът изглежда по-подробен, отколкото очаквах, и ще се радвам на коментари относно опростяването или нещо, което пропускам. Този въпрос е малко разширение на този основен въпрос за кеша. Кодът (леко опростен за представяне тук) е както следва:
def findById(id: Int): Option[Learner] = {
Cache.getAs[Learner]("learner." + id) match {
case None => DB.withConnection { implicit c => //-- no cache, read DB
SQL("select * from learner where id={id}")
.on('id -> id)
.as(learnerP.singleOpt) match {
case Some(learner) => { //-- found, set cache
Cache.set("learner." + learner.id, learner)
Some(learner)
}
case _ => None //-- no find in DB, do not set cache
}
}
case Some(learner) => Some(learner) //-- return value in cache
}
}
Редактиране: Важно е да зададете стойностите на кеша навсякъде, където Learner (в този случай) се актуализира или вмъква. Настройката при вмъкване е необходима, в противен случай заявка преди вмъкването ще настрои кеша на None и след това бъдещи getAs или getOrElse извиквания ще върнат None, въпреки че вече съществува стойност.