【问题标题】:Slick threadLocalSession vs implicit session光滑的 threadLocalSession 与隐式会话
【发布时间】:2013-12-21 19:00:43
【问题描述】:

我在发布这个问题时遇到了这个问题:Slick Write a Simple Table Creation Function

我对 Slick 和并发非常陌生,只知道基础知识。我以前使用过 JDBC,但在那里你必须手动打开一个会话然后关闭它。没有什么比这更重要的了,而且几乎没有自动化(至少我不必制作自动化流程)。

但是,我对 Slick 会话感到困惑。在教程中,示例“入门”鼓励人们使用threadLocalSession

// 使用隐式threadLocalSession

导入 Database.threadLocalSession

http://slick.typesafe.com/doc/1.0.0/gettingstarted.html

原来的推荐是:

我们使用的唯一额外导入是 threadLocalSession。这 通过将会话附加到当前会话来简化会话处理 线程,因此您不必自己传递它(或至少 将其分配给隐式变量)。

嗯,我在网上研究了一下,有人建议不要使用threadLocalSession,只使用隐式会话。有人建议使用 threadLocalSession。

支持隐式会话的一个原因是“确保在编译时你有一个会话”。好吧,我只有两个问题:

  1. 当人们使用“线程”时,他们指的是并发吗? Slick/JDBC 数据存储是通过并发处理的?

  2. 哪种方式更好?隐式还是线程本地会话?或者什么时候用哪个?

  3. 如果要问的不是太多,我在我的 Scala 书籍的某处读到了 {implicit session:Session => ...} 的语法,但我忘记了它在哪里。这是什么表达方式?

【问题讨论】:

    标签: scala playframework playframework-2.0 slick


    【解决方案1】:
    1. 以这种方式调用 threadLocalSession 是因为它存储在当前执行线程本地的“线程局部变量”中。

    2. 从 Slick 2 开始,我们建议不要使用 threadLocalSession(现在称为 dynamicSession),除非您特别需要它并且知道它的缺点。顺便说一下,threadLocalSession 也是隐式的。问题是,只有当 withSession(在 Slick 2.0 withDynSession 中)调用发生在调用堆栈下方的某个地方时,threadLocalSession 在运行时才有效。如果没有,代码仍然可以编译但在运行时失败

    3. {implicit session:Session => ...} 是一个从(显式注释类型)Session 到 ... 的函数,其中会话可作为 ... 中的隐式值使用。在 db.withSession{implicit session:Session => ... } 中,db 创建一个会话,将其传递给传递给 withSession 的闭包。在闭包体...中,会话是隐式的,可以被 .list 调用等隐式使用。

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多