2011-12-26 9 views
6

Po prostu zaczyna się w Play. Dokumentacja mówi o tym, jak Play może być uruchamiana asynchronicznie.Jak uruchamiać asynchroniczne/nie blokujące zapytania MySQL w strukturze Play?

Ale jak uruchomić kwerendy MySQL podczas uruchamiania Asynchronicznie? Normalne zapytania MySQL są blokowane, prawda? To by nie działało.

Node.js ma własnych, nie blokujących klientów MySQL, tylko do tego celu, ale nie mogę znaleźć niczego podobnego do Play.

Jak uruchomić kwerendy MySQL w asynchronicznej aplikacji Play?

Odpowiedz

3

spójrz na ten link Asynchronous jobs w ramce gry.

+1

Dzięki. Nie jestem pewien, czy rozumiem, jak praca może być blokująca. Jeśli mój klient MySQL jest blokowany, to używanie go w ramach zadania nadal byłoby blokowane, nie? Czy też Play odradza się nowy wątek za każdym razem, gdy tworzone jest nowe zadanie? W takim przypadku to rodzaj pokonuje cały cel struktury asynchronicznej. – Continuation

+2

@ Kontynuacja Myślę, że może być mylące "asynchroniczny framework" z "framework zdolny do asynchronicznych operacji" w odniesieniu do Play! struktura? Jak wyjaśnia powiązana dokumentacja, można używać zadań do wykonywania długotrwałych operacji asynchronicznie od żądania HTTP i bez blokowania do innych przychodzących żądań HTTP. – tmbrggmn

2

Odtwórz Zadania są wykonywane w osobnym wątku i zwalniają główny wątek http. Główny wątek http jest następnie uruchamiany tam, gdzie został przerwany, gdy zadanie (zawinięte w obiekt obietnicy) powróci po zakończeniu.

Główny wątek protokołu HTTP nie jest więc wstrzymywany i można go udostępnić do obsługi innych przychodzących żądań http.

0

Generalnie wykonywanie wywołań SQL do DB jest zwykle blokowane i wykonywane sekwencyjnie. Play ma doskonałą obsługę asynchronicznego wykonywania, co poprawia wydajność Twojej aplikacji.

kod przykładowy Praca Zagraj 2,0

public static Result slow() { 
    Logger.debug("slow started"); 

    // Start execution 
    Promise<DataObject> userObject1 = SlowQuery.getUser(440); 
    Promise<DataObject> userObject2 = SlowQuery.getCategory(420); 
    // ... here execution is already in progress ... 

    // Map to Promise Objects 
    Promise<DataObject> res1 = userObject1.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject1): " + res.toString()); 
      return res; 
     } 
    }); 

    Promise<DataObject> res2 = userObject2.map(new Function<DataObject, DataObject>() { 
     public DataObject apply(DataObject res) { 
      Logger.debug("Got result (userObject2): " + res.toString()); 
      return res; 
     } 
    }); 

    // here we wait for completion - this blocks 
    userObject1.getWrappedPromise().await(); 
    userObject2.getWrappedPromise().await(); 

    // the result is available 
    Logger.debug(res1.get().toString()); 
    Logger.debug(res2.get().toString()); 

    Logger.debug("slow finished"); 
    return ok("done"); 
} 

krępuj się poprawić za pomocą funkcji wiki społeczności - Jestem pewien, że niektóre części mogą ulec skróceniu.

+7

Ale dopóki sam klient bazy danych się blokuje, wątek Play również zostanie zablokowany, nie? Node.js dostarcza niezablokowanego klienta MySQL, dzięki czemu rozwiązuje problem. Ale myślę, że Play nie oferuje żadnego nieblokującego klienta DB. Czy możesz wyjaśnić, w jaki sposób twój kod zmienia połączenia DB w nieblokujące? – Continuation