我在考虑以下哪种方法更好。 要为更大的范围重用会话还是使用更小的范围?
以下两个例子来说明差异。
示例1小范围:
def thumbnail(id: Int) = SecuredAction { implicit request =>
DB.withSession { implicit session => Models.get(id) } match {
case None => NotFound("The requested model is either not in the db or you lack access to it.")
case Some(model) => {
Ok(views.html.model.thumbnail(model, DB.withSession { implicit session => Tags.tags(model) }))
}
}
}
示例2大范围:
def thumbnail(id: Int) = SecuredAction { implicit request =>
DB.withSession { implicit session =>
Models.get(id) match {
case None => NotFound("The requested model is either not in the db or you lack access to it.")
case Some(model) => {
Ok(views.html.model.thumbnail(model, Tags.tags(model)))
}
}
}
}
您怎么看?
答案 0 :(得分:2)
我会(并且通常会)使用第二种方法,我实际上并不知道Slick打开新会话(通常是数据库)有多重,但为什么会放弃简单的性能改进?
从工作流程的角度来看,打开会话,将其用于小型操作,关闭它然后立即打开另一个会话后没有意义,唯一想到的就是你可以拥有一个非常密集的数据库操作,会话可能不会持续(取决于你的DBMS),可能只有这样才能使用新的。
另请注意,第一种方法的可读性远低于第二种方法,我会开始想知道为什么实施第一种方法的人就是这样做的。
无论如何只是我的2美分,我会发布它作为评论,但它太长了。
答案 1 :(得分:1)
第二个避免重复,所以我投票支持第二个。
您尝试使用第一个解决方案更容易阅读代码,但实际上,分析起来比较困难。
事实上,我们通常不会在scala中看到这种模式:
{...} match { ... //brackets just before matching