发布此问题时遇到此问题: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。
支持隐式会话的一个原因是“在编译时确保您有会话”。好吧,我只有两个问题:
当人们使用“线程”时,他们是指并发吗? Slick / JDBC数据存储是通过并发处理的吗?
哪种方式更好?隐式或threadLocalSession?或何时使用哪个?
如果问的不是太多,我会在Scala书中的某处读到{implicit session:Session => ...}
的语法,我忘了它的位置。这个表达是什么?
答案 0 :(得分:6)
以这种方式调用threadLocalSession,因为它存储在当前执行线程本地的“线程局部变量”中。
从Slick 2开始,我们建议不要使用threadLocalSession(现在称为dynamicSession),除非你看到它的特殊需要并且意识到它们的缺点。顺便说一句,threadLocalSession也是隐式的。问题是,当一个withSession(在Slick 2.0 withDynSession中)调用发生在调用堆栈的某个地方时,threadLocalSession仅在运行时有效。如果没有,代码仍然编译但在运行时失败
{隐式会话:会话=> ...}是一个函数,从(明确注释的类型)Session到...,其中会话可用作...中的隐式值。在db.withSession中{隐式会话:会话=> ...},db创建一个会话,将其传递给传递给withSession的闭包。在闭包体......中,会话是隐式的,可以由.list调用等隐式使用。