簡體   English   中英

如何在Play框架中運行異步/非阻塞MySQL查詢?

[英]How to run async / non-blocking MySQL queries in Play framework?

剛開始玩。 該文檔討論了如何異步運行Play。

但是如何在異步運行Play時運行MySQL查詢? 正常的MySQL查詢是阻塞的,對吧? 所以那不行。

Node.js有它自己的非阻塞MySQL客戶端只是為了這個目的,但我找不到任何類似的Play。

如何在異步Play應用程序中運行MySQL查詢?

在這個鏈接中查看Play框架中的異步作業

播放作業在單獨的線程中執行並釋放主http線程。 然后在完成后返回Job(包含在Promise對象中)時返回的主要http線程停止。

因此,主http線程不會被阻止,並且可以用於處理其他傳入的http請求。

通常,執行SQL調用DB通常是阻塞並按順序執行。 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連接器。 例如https://code.google.com/p/async-mysql-connector/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM