2013-06-04 12 views
7

Ich versuche, die Slick-Bibliothek TypeSafe für die Schnittstelle mit einem MySQL-Server zu nutzen. Alle gettingstarted/Tutorial-Beispiele verwenden withSession{}, wo das Framework automatisch eine Sitzung erstellt, die Abfragen innerhalb der {}s ausführt und dann die Sitzung am Ende des Blocks beendet.Datenbanksitzung offen halten

Mein Programm ist ziemlich chatty, und ich möchte eine durchgehende Verbindung während der Ausführung des Skripts beibehalten. Bis jetzt habe ich diesen Code zusammengestellt, um Sitzungen explizit zu erstellen und zu schließen.

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

Wo kann ich Abfragen dazwischen ausführen. Allerdings, wenn ich versuchen, einen Befehl, wie

auszuführen (Qu + "Einfügen in TEST (Name) VALUES (' "+ name +"')"). Ausführen

Es stürzt ab, weil Es kann die implizite Sitzung nicht finden. Ich verstehe die syntax of the execute definition in the documentation nicht vollständig, aber es scheint, als ob es einen optionalen Parameter geben könnte, um eine explizite Sitzung zu übergeben. Ich habe versucht, .execute (s) zu verwenden, aber das spuckt eine Warnung aus, die (s) nichts in einer reinen expession tut.

Wie lege ich explizit eine vorhandene Sitzung fest, um eine Abfrage auszuführen?

Appended: Testcode für JAB-Lösung

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) 
      } 
     } 
    } 
} 

Welche Compiler-Fehler zurückgibt

[Fehler] /home/ubuntu/helloworld/src/main/scala/hw.scala: 41: fehlender Parametertyp für erweiterte Funktion

[Fehler] Die Argumenttypen einer anonymen Funktion müssen vollständig bekannt sein. (SLS 8.5)

[Fehler] Erwarteter Typ war:?

[Fehler] {

[Fehler]^

[Fehler] ein Fehler gefunden

Antwort

7

konnte ich ableiten, was ich von this answer benötigt scheinen

//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

nur den relevanten Teil des Skripts in withSession{} umschließen. Beachten Sie, dass Sie, wenn Sie die Sitzung eine Weile geöffnet lassen/viele Datenbankmanipulationsabfragen durchführen, auch die Vorteile von Transaktionen untersuchen sollten.

Und Sie sollten wirklich vorbereitete Anweisungen für Einsätze verwenden, wenn die Daten eine potenziell externe Quelle haben.

+0

Dies gilt nicht für meine implimentation zu arbeiten. Ich habe einen Schauspieler, der Nachrichten empfängt, die ich dann in der Datenbank speichern möchte. Die Nachrichten werden asynchron über die Schnittstelle receive() empfangen. Ich habe versucht, die withSession {} um die receive() Definition zu wickeln, aber scala mag es nicht, dass ich Definitionen in einer anonymen Funktion definiere. –

+0

Ja, ich beabsichtige auch, Transaktionen/vorbereitete Anweisungen als nächstes anzugehen, nachdem ich mit einer einfachen Abfrage ein funktionierendes PoC für meine Sessions einrichten kann. :) –

+0

Was Scala nicht gefällt? Zugegebenermaßen habe ich nicht so viel mit Gleichzeitigkeit in Kontextmanagern gearbeitet, aber ich verstehe nicht, warum eine Definition innerhalb einer anonymen Funktion sich von einer Definition innerhalb einer benannten Funktion unterscheidet. Vielleicht ist da noch ein anderes Problem? – JAB

Verwandte Themen