2011-12-26 2 views
6

Просто начать играть. В документации говорится о том, как Play можно запускать асинхронно.Как запустить асинхронные/неблокирующие запросы MySQL в платформе Play?

Но как запускать запросы MySQL при запуске Асинхронно? Обычные запросы MySQL блокируются, не так ли? Так что это не сработает.

У Node.js есть свои неблокирующие клиенты MySQL именно для этой цели, но я не могу найти ничего похожего на Play.

Как выполнить запросы MySQL в асинхронном приложении Play?

ответ

3

Посмотрите на эту ссылку Asynchronous jobs в игре рамки.

+1

Спасибо. Я не уверен, что понимаю, как рабочие места могут быть неблокирующими. Если мой клиент MySQL блокирует, то использование его в задании все равно будет блокировать, нет? Или Play воспроизводит новый поток каждый раз, когда создается новое задание? В этом случае это отчасти поражает всю цель асинхронной структуры. – Continuation

+2

@ Продолжение. Думаю, вы можете ввести в заблуждение «асинхронную структуру» с «каркасом, способным к асинхронным операциям» в отношении Play! фреймворк? Как поясняет связанная документация, вы можете использовать задания для выполнения длительных операций асинхронно из HTTP-запроса и неблокирования для других входящих HTTP-запросов. – tmbrggmn

2

Play Джеты выполняются в отдельном потоке и освобождают основной поток HTTP. Затем начинается основной HTTP-поток, где он остановился, когда Задание (завернутое в объект Promise) возвращается после завершения.

Таким образом, основной поток HTTP не поддерживается и может быть доступен для обработки других входящих HTTP-запросов.

0

В общем случае выполнение SQL-вызовов в БД обычно блокируется и выполняется последовательно. Play имеет отличную поддержку для асинхронного выполнения, что повышает производительность вашего приложения.

Рабочий пример кода для Play 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"); 
} 

стесняйтесь улучшить с помощью сообщества функции вики - Я уверен, что некоторые части могут быть сокращены.

+7

Но до тех пор, пока клиент базы данных блокируется, поток Play также будет заблокирован, нет? Node.js предоставляет неблокирующий клиент MySQL, чтобы решить эту проблему. Но я не думаю, что Play предлагает любого неблокирующего клиента БД. Можете ли вы объяснить, как ваш код превращает вызовы БД в неблокирующиеся? – Continuation

Смежные вопросы