为多个查询重用数据库会话?

时间:2014-08-10 18:08:28

标签: java database scala playframework slick

我在考虑以下哪种方法更好。 要为更大的范围重用会话还是使用更小的范围?

以下两个例子来说明差异。

示例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)))
        }
      }
    }
  }

您怎么看?

2 个答案:

答案 0 :(得分:2)

我会(并且通常会)使用第二种方法,我实际上并不知道Slick打开新会话(通常是数据库)有多重,但为什么会放弃简单的性能改进?

从工作流程的角度来看,打开会话,将其用于小型操作,关闭它然后立即打开另一个会话后没有意义,唯一想到的就是你可以拥有一个非常密集的数据库操作,会话可能不会持续(取决于你的DBMS),可能只有这样才能使用新的。

另请注意,第一种方法的可读性远低于第二种方法,我会开始想知道为什么实施第一种方法的人就是这样做的。

无论如何只是我的2美分,我会发布它作为评论,但它太长了。

答案 1 :(得分:1)

第二个避免重复,所以我投票支持第二个。

您尝试使用第一个解决方案更容易阅读代码,但实际上,分析起来比较困难。

事实上,我们通常不会在scala中看到这种模式:

{...} match { ...  //brackets just before matching