2013-06-04 8 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(名)の値(挿入"")など

として、コマンドを実行しようとする。

を実行することがクラッシュしたため、暗黙のセッションを見つけることができません。私はsyntax of the execute definition in the documentationを完全に理解していませんが、明示的なセッションを渡すためのオプションのパラメータがあるようです。私は.execute(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)

[エラー]予想されるタイプは?

[エラー] {

[エラー]^

[エラー] 1つのエラーがちょうどwithSession{}でスクリプトの関連部分を囲む

答えて

7

私はできたが、私はこれは私のimplimentationのために動作していないよう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

を見つけました。セッションをしばらく開いたままにしている場合や、たくさんのデータベース操作クエリを実行している場合は、トランザクションを活用することも検討する必要があります。

データに潜在的に外部ソースがある場合は、挿入のために準備済みのステートメントを使用してください。

+0

から必要なものを導き出します。私は俳優にメッセージを受け取り、それをデータベースに記録したいと思っています。メッセージはreceive()インタフェースを介して非同期に受信されます。私はwithSession {}をreceive()定義の回りにラップしようとしましたが、scalaは無名関数の中で定義を作成するのが好きではありません。 –

+0

また、基本的なクエリを使用してセッション設定用の作業PoCを取得した後、次にトランザクション/準備文に取り掛けるつもりです。 :) –

+0

スカラはそれについて何が好きではないのですか?確かに私はコンテキストマネージャーで並行処理をしていませんが、無名関数内の定義が名前付き関数内の定義と異なるのはなぜですか。おそらく別の問題が関与しているでしょうか? – JAB

関連する問題