簡體   English   中英

光滑的threadLocalSession與隱式會話

[英]Slick threadLocalSession vs implicit session

我在發布這個問題時遇到了這個問題: Slick寫一個簡單的表創建函數

我對Slick和並發很新,只知道基礎知識。 之前我使用過JDBC,但在那里你必須手動打開一個會話然后關閉它。 沒有什么比這更好了,自動化很少(至少我不需要進行自動化處理)。

但是,我對Slick會話感到困惑。 在本教程中,示例“Getting Started”鼓勵人們使用threadLocalSession

//使用隱式threadLocalSession

import 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. 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調用等隱式使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM