【问题标题】:What's the level of asynchronism in Play! frameworkPlay 中的异步级别是多少!框架
【发布时间】:2012-02-20 20:17:46
【问题描述】:

玩!吹捧它的异步 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. 如果我们将此类调用包装在 future/promise/await 中,会导致线程切换(除了由于 DB 调用的普遍性带来的不便)对吧?
  3. 有鉴于此,与具有 NIO 连接器(例如 Tomcat + NIO 连接器但不使用新的事件处理程序)的 servlet 服务器相比,它在为这种数据库访问模式提供服务时的异步性如何?
  4. 有没有计划支持异步DB驱动,比如http://code.google.com/p/adbcj/

【问题讨论】:

  • 标题中的错字。应该是'level',而不是'leven'

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


【解决方案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

我不相信 Play 的异步功能值得,因为它使代码和测试变得非常复杂。如果您需要在单台机器上每秒处理数千个请求,同时调用慢速服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多