2013-06-04 137 views
7

我試圖利用TypeSafe的光滑庫與MySQL服務器進行交互。所有開始/教程示例使用withSession{},其中框架將自動創建會話,執行{}中的查詢,然後在該塊的結尾處終止會話。保持數據庫會話打開

我的程序相當囉嗦,我想在整個腳本執行過程中保持一個持續連接。到目前爲止,我已將這些代碼拼湊在一起,以明確創建和關閉會話。

val db = Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="***", driver = "com.mysql.jdbc.Driver") 
val s = db.createSession() 
... 
s.close() 

我可以在哪裏執行查詢。然而,當我嘗試執行命令,如

(曲+ 「插入TEST(名稱)VALUES( ' 」+姓名+「')」)。執行

它崩潰,因爲它找不到隱式會話。我不完全瞭解syntax of the execute definition in the documentation,但似乎可能有一個可選參數傳遞顯式會話。我試過使用.execute(s),但是吐出一個警告,說明(s)在純粹的經驗中不會做任何事情。

如何顯式指定預先存在的會話以運行查詢?

追加:試用代碼JAB的解決方案

class ActorMinion(name: String) extends Actor 
{ 
    Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="****", driver = "com.mysql.jdbc.Driver") withSession 
    { 
     def receive = 
     { 
      case Execute => 
      { 
       (Q.u + "insert into TEST (name) values('"+name+"')").execute 

       sender ! DoneExecuting(name,output,err.toString) 
      } 
     } 
    } 
} 

它返回編譯錯誤

[錯誤] /home/ubuntu/helloworld/src/main/scala/hw.scala: 41:缺少擴展功能的參數類型

[錯誤]匿名函數的參數類型必須完全已知。 (SLS 8.5)

[錯誤]預期類型是:?

[錯誤] {

[錯誤]^

[錯誤]一個錯誤發現

回答

7

我能得到我從this answer

//imports at top of file 
//import Database.threadLocalSession <--this should be commented/removed 
import scala.slick.session.Session // <-- this should be added 
...... 
//These two lines in actor constructor 
val db = Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="****", driver = "com.mysql.jdbc.Driver") 
implicit var session: Session = db.createSession() 
...... 
session.close() //This line in actor destructor 
2

只需附上你的腳本中的相關部分中withSession{}。請注意,如果您將會話保持打開一段時間/正在執行大量數據庫操作查詢,則還應該考慮利用事務。

如果數據有潛在的外部來源,你應該真的使用預處理語句來插入。

+0

這需要什麼似乎並沒有爲我的執行力度工作。我有一個演員接收我想要記錄在數據庫中的消息。這些消息是通過receive()接口異步接收的。我試着圍繞receive()定義包裝withSession {},但scala不喜歡我在匿名函數中進行定義。 –

+0

另外,是的,我打算在下一次處理事務/預處理語句後,我可以使用基本查詢爲我的會話設置獲得工作PoC。 :) –

+0

斯卡拉不喜歡它什麼?無可否認,我並沒有在上下文管理器中使用併發性,但我不明白爲什麼匿名函數中的定義與命名函數中的定義有任何不同。也許還有另外一個問題呢? – JAB