2011-12-26 16 views
6

Recién comenzando en Play. La documentación habla sobre cómo Play se puede ejecutar de forma asíncrona.¿Cómo ejecutar consultas MySQL asincrónicas/no bloqueadas en Play framework?

¿Pero cómo ejecutar consultas MySQL cuando se ejecuta Play asincrónicamente? Las consultas normales de MySQL son de bloqueo, ¿no? Entonces eso no funcionaría.

Node.js tiene sus propios clientes MySQL sin bloqueo solo para este propósito, pero no encuentro nada similar para Play.

¿Cómo se ejecutan las consultas MySQL dentro de una aplicación Play asíncrona?

Respuesta

3

mira en este enlace Asynchronous jobs en el marco de juego.

+1

Gracias. Sin embargo, no estoy seguro de entender cómo los trabajos pueden ser no bloqueantes. Si mi cliente MySQL está bloqueando, entonces usarlo dentro de un trabajo todavía estaría bloqueando, ¿no? ¿O Play genera un nuevo hilo cada vez que se crea un nuevo trabajo? En ese caso, de alguna manera se vence el objetivo de un marco asíncrono. – Continuation

+2

@Continuation Creo que puede confundir el "marco asíncrono" con "framework capaz de operaciones asincrónicas" en lo que respecta a Play! ¿marco de referencia? Como explica la documentación vinculada, puede usar trabajos para realizar operaciones de larga ejecución de forma asincrónica desde la solicitud HTTP y sin bloqueo a otras solicitudes HTTP entrantes. – tmbrggmn

2

Play Los trabajos se ejecutan en un hilo separado y liberan el hilo http principal. El hilo http principal se inicia donde lo dejó cuando el Trabajo (envuelto en un objeto Promesa) regresa después de completar.

Por lo tanto, el hilo http principal no se detiene y puede estar disponible para manejar otras solicitudes HTTP entrantes.

0

En general, la ejecución de SQL Las llamadas a DB generalmente se bloquean y ejecutan secuencialmente. Play tiene una gran compatibilidad con la ejecución asincrónica que mejora el rendimiento de tu aplicación.

Trabajando ejemplo de código para el juego 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"); 
} 

se sienten libres para mejorar el uso de la función wiki de la comunidad - Estoy seguro de que algunas partes se pueden acortar.

+7

Pero mientras el cliente de la base de datos esté bloqueando, el hilo Play también se bloqueará, ¿no? Node.js proporciona un cliente MySQL sin bloqueo para que resuelva el problema. Pero no creo que Play ofrezca ningún cliente DB no bloqueante. ¿Puede explicar cómo su código convierte las llamadas DB en no bloqueantes? – Continuation