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
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. –
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. :) –
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