Play中的异步级别是多少!骨架

时间:2012-01-27 21:11:02

标签: java asynchronous playframework-2.0 nio playframework-1.x

播放!吹嘘它的异步HTTP处理功能,虽然我不清楚其他什么是真正的异步(非阻塞 没有线程切换。)在我阅读的异步示例中,就像下面从Play中获取的那个!框架食谱:

public static void generateInvoice(Long orderId) {
    Order order = Order.findById(orderId); // #a
    InputStream is = await(new OrderAsPdfJob(order).now()); // #b
    renderBinary(is);
}

他们专注于#b的漫长/昂贵的“业务逻辑”步骤,但我关注的是#a的数据库调用。实际上,许多应用程序中的大多数控制器方法只会尝试对DB执行多个CRUD,例如:

public static void generateInvoice(Long orderId) {
    Order order = Order.findById(orderId); // #a
    render(order);
}

我特别关注在提供此数据库访问模式时使用“少量线程”的说法。

所以问题是

  1. 会玩!会阻止JDBC调用吗?
  2. 如果我们在将来/ promise / await中包含这样的调用,它会导致线程切换(除了由于DB调用的普遍性造成的不便),对吗?
  3. 鉴于此,在提供此数据库访问模式时,与具有NIO连接器的servlet服务器(例如Tomcat + NIO连接器,但不使用新的事件处理程序)相比,它的异步性如何?
  4. 是否有任何支持异步数据库驱动程序的计划,例如http://code.google.com/p/adbcj/

1 个答案:

答案 0 :(得分:1)

  1. Play会阻止JDBC调用 - 没有什么可以阻止它的。
  2. 要将一个j.u.c.Future包装在F.Promise for Play中,需要一个循环。这可能会导致大量的上下文切换。
  3. Servlet容器可以使用NIO,例如保持请求之间的连接打开而不占用非活动连接的线程。但是请求处理代码中的JDBC调用将阻塞并绑定一个相同的线程。
  4. ADBCJ实现j.u.c.Future,但也支持回调,可以绑定到F.Promise,请参阅https://groups.google.com/d/topic/play-framework/c4DOOtGF50c/discussion
  5. 我不相信Play的异步功能是值得的,因为它使代码和测试变得复杂多少。也许如果你需要在一台机器上每秒处理数千个请求,同时调用慢速服务。