2013-06-04 17 views
7

Próbuję wykorzystać zręczną bibliotekę TypeSafe do połączenia z serwerem MySQL. Wszystkie przykłady uruchomienia/samouczka używają withSession{}, gdzie framework automatycznie utworzy sesję, wykona zapytania w obrębie {}, a następnie zakończy sesję na końcu bloku.Otwarcie sesji bazy danych

Mój program jest raczej rozmowny i chciałbym utrzymywać stałe połączenie podczas wykonywania skryptu. Do tej pory skasowałem ten kod, aby jawnie tworzyć i zamykać sesje.

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

Gdzie mogę wykonywać zapytania pomiędzy. Jednak, gdy próbuję wykonać polecenia, takie jak

(Qu + "wstawić do testu (nazwa) wartości (' "+ nazwa +"')"). Wykonać

wywala To dlatego nie może znaleźć niejawnej sesji. Nie do końca rozumiem syntax of the execute definition in the documentation, ale wydaje się, że może istnieć opcjonalny parametr do przekazania jawnej sesji. Próbowałem używać .execute (s), ale to wypluwa ostrzeżenie, że (s) nie robi nic w czystej expession.

Jak jawnie określić wcześniejszą sesję do uruchomienia zapytania?

załączono: Kod Trial do sporządzania roztworu Jab za

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

Które zwraca błąd kompilacji

[Błąd] /home/ubuntu/helloworld/src/main/scala/hw.scala: 41: brakujący typ parametru dla funkcji rozszerzonej

[błąd] Typy argumentów funkcji anonimowej muszą być w pełni znane. (SLS 8.5)

[błąd] Oczekiwano typu:?

[Błąd] {

[Błąd]^

[Błąd] jeden błąd znaleziony

Odpowiedz

7

byłem w stanie czerpać to, co potrzebne od 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

Wystarczy załączyć odpowiednią część skryptu w withSession{}. Zauważ, że jeśli utrzymujesz sesję otwartą przez jakiś czas/wykonujesz wiele zapytań o manipulację bazami danych, powinieneś również przyjrzeć się korzystaniu z transakcji.

Powinieneś naprawdę używać przygotowanych instrukcji dla wstawek, jeśli dane mają potencjalnie zewnętrzne źródło.

+0

To nie wydają się działać na moim implimentation. Mam aktora, który odbiera wiadomości, które chcę zapisać w bazie danych. Komunikaty są asynchronicznie odbierane przez interfejs receive(). Próbowałem owijać obiekt withSession {} wokół definicji receive(), ale scala nie lubi, gdybym tworzył definicje wewnątrz anonimowej funkcji. –

+0

Ponadto, tak, zamierzam zająć się transakcjami/przygotowanymi instrukcjami następnymi, po tym jak mogę uzyskać działający PoC dla moich ustawień sesji przy użyciu podstawowego zapytania. :) –

+0

Co takiego Scala nie lubi? Trzeba przyznać, że nie pracowałem zbyt wiele razy z menedżerami kontekstu, ale nie widzę powodu, dla którego definicja wewnątrz anonimowej funkcji byłaby czymś różnym od definicji wewnątrz nazwanej funkcji. Może chodzi o inny problem? – JAB