2011-12-26 29 views
6

Chỉ mới bắt đầu trên Play. Tài liệu nói về cách Play có thể chạy không đồng bộ.Làm cách nào để chạy truy vấn MySQL không đồng bộ/không chặn trong khung Chơi?

Nhưng cách chạy truy vấn MySQL khi chạy Play không đồng bộ? Các truy vấn MySQL bình thường đang chặn, phải không? Vì vậy, điều đó sẽ không hoạt động.

Node.js có các máy khách MySQL không chặn riêng của nó chỉ cho mục đích này, nhưng tôi không thể tìm thấy bất kỳ điều gì tương tự cho Play.

Làm thế nào để bạn chạy các truy vấn MySQL trong một ứng dụng Play không đồng bộ?

Trả lời

3

xem liên kết này Asynchronous jobs trong khung chơi.

+1

Cảm ơn. Tôi không chắc rằng tôi hiểu cách thức hoạt động của công việc có thể không bị chặn. Nếu máy khách MySQL của tôi đang chặn, thì việc sử dụng nó trong một công việc vẫn sẽ bị chặn, phải không? Hay Play có tạo ra một chuỗi mới mỗi lần tạo một công việc mới không? Trong trường hợp đó, nó đánh bại toàn bộ mục đích của một khung công tác không đồng bộ. – Continuation

+2

@Continuation Tôi nghĩ rằng bạn có thể gây nhầm lẫn "khung không đồng bộ" với "khung có khả năng hoạt động không đồng bộ" liên quan đến Play! khuôn khổ? Vì tài liệu được liên kết giải thích, bạn có thể sử dụng các công việc để thực hiện các hoạt động lâu dài không đồng bộ từ yêu cầu HTTP và không chặn các yêu cầu HTTP đến khác. – tmbrggmn

2

Công việc phát được thực hiện trong một chuỗi riêng biệt và giải phóng chuỗi http chính. Sau đó, chuỗi http chính bắt đầu khi nó bị bỏ đi khi công việc (được bao bọc trong một đối tượng Promise) trả về sau khi hoàn thành.

Vì vậy, chuỗi http chính không được giữ và có thể sẵn có để xử lý các yêu cầu http đến khác.

0

Trong việc thực hiện chung các cuộc gọi SQL tới DB thường bị chặn và được thực hiện tuần tự. Play có hỗ trợ tuyệt vời cho việc thực thi Không đồng bộ giúp cải thiện hiệu suất của ứng dụng của bạn.

Làm việc mẫu mã cho Chơi 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"); 
} 

cảm thấy tự do để nâng cao sử dụng tính năng cộng đồng wiki - Tôi chắc chắn một số bộ phận có thể được rút ngắn.

+7

Nhưng miễn là bản thân máy khách cơ sở dữ liệu bị chặn thì luồng Play cũng sẽ bị chặn, phải không? Node.js cung cấp một máy khách MySQL không chặn để giải quyết vấn đề. Nhưng tôi không nghĩ Play cung cấp bất kỳ ứng dụng khách DB không chặn nào. Bạn có thể giải thích mã của bạn chuyển DB gọi thành không bị chặn không? – Continuation

Các vấn đề liên quan