【问题标题】:Reuse database session for several queries?为多个查询重用数据库会话?
【发布时间】:2014-08-10 18:08:28
【问题描述】:

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

下面两个例子来说明区别。

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

你怎么看?

【问题讨论】:

    标签: java database scala playframework slick


    【解决方案1】:

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

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

    另外请注意,第一种方法比第二种方法可读性差得多,我开始想知道为什么第一种方法的实现者会以这种方式这样做。

    反正只是我的 2 美分,我会把它作为评论发布,但它太长了。

    【讨论】:

    • 感谢您的回答,您能澄清一下这是什么意思吗? “我会开始想知道为什么实施第二种方法的人会这样做。”如果我正确理解了这句话,那么我自己实现了这两种方法。
    • 对不起,我的意思是作为外部阅读您的代码,我会认为您有会话问题(如会话到期)并且 get 操作非常密集,我只是想其他人正在阅读您的代码。
    • 感谢您的澄清,现在我明白您的意思了。
    【解决方案2】:

    第二个避免了任何重复,所以我会投票给第二个。

    您尝试使用第一个解决方案使您的代码更易于阅读,但实际上,它更难分析。

    确实,我们在 scala 中并不经常看到这种模式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2012-07-25
      相关资源
      最近更新 更多