光滑的threadLocalSession与隐式会话

时间:2013-12-21 19:00:43

标签: scala playframework playframework-2.0 slick

发布此问题时遇到此问题: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. 哪种方式更好?隐式或threadLocalSession?或何时使用哪个?

  3. 如果问的不是太多,我会在Scala书中的某处读到{implicit session:Session => ...}的语法,我忘了它的位置。这个表达是什么?

1 个答案:

答案 0 :(得分:6)

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

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

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