В общем случае выполнение 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");
}
стесняйтесь улучшить с помощью сообщества функции вики - Я уверен, что некоторые части могут быть сокращены.
Спасибо. Я не уверен, что понимаю, как рабочие места могут быть неблокирующими. Если мой клиент MySQL блокирует, то использование его в задании все равно будет блокировать, нет? Или Play воспроизводит новый поток каждый раз, когда создается новое задание? В этом случае это отчасти поражает всю цель асинхронной структуры. – Continuation
@ Продолжение. Думаю, вы можете ввести в заблуждение «асинхронную структуру» с «каркасом, способным к асинхронным операциям» в отношении Play! фреймворк? Как поясняет связанная документация, вы можете использовать задания для выполнения длительных операций асинхронно из HTTP-запроса и неблокирования для других входящих HTTP-запросов. – tmbrggmn