Как выполнить асинхронные / неблокирующие запросы MySQL в платформе Play? - PullRequest
6 голосов
/ 26 декабря 2011

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 26 декабря 2011

посмотрите по этой ссылке Асинхронные задания в игровой среде.

2 голосов
/ 26 декабря 2011

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

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

0 голосов
/ 13 февраля 2014

Вам следует рассмотреть возможность использования неблокирующего коннектора MySQL.Например, https://code.google.com/p/async-mysql-connector/

0 голосов
/ 01 мая 2012

В общем случае выполнение 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");
}

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

...