java - Play! 的异步程度如何?框架

标签 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 处的数据库调用。事实上,许多应用程序中的大多数 Controller 方法只会尝试对数据库执行多个 CRUD,例如:

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

我特别担心在为这种数据库访问模式提供服务时使用“少量线程”的说法。

所以问题是

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

最佳答案

  1. Play 将阻止 JDBC 调用——没有任何魔法可以阻止这种情况。
  2. 要将 j.u.c.Future 包装在 F.Promise for Play 中,需要一个循环。这可能会导致大量上下文切换。
  3. Servlet 容器可以使用 NIO,例如在请求之间保持连接打开,而不占用非 Activity 连接的线程。但是请求处理代码中的 JDBC 调用将同样阻塞和占用线程。
  4. ADBCJ 实现 j.u.c.Future,但也支持回调,可以绑定(bind)到 F.Promise,参见 https://groups.google.com/d/topic/play-framework/c4DOOtGF50c/discussion .

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

关于java - Play! 的异步程度如何?框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9040129/

相关文章:

java - Android如何像在iOS中一样将异步任务分组在一起

playframework-2.0 - 玩转框架 2.0 演进并创建触发器

playframework-2.0 - 升级到 SecureSocial 2.0.12,现在 session 没有被保留

java - 无堆栈信息 - V(来源未知)

java - RecyclerView 反向无限滚动

swift - Alamofire Swift 3 仅上传数组中的最后一张图片

javascript - 在useEffect中设置状态完成后如何调用函数?

javascript - 异步编程: yield vs async/await

playframework - Mailer-Plugin 未显示在应用程序的依赖项中

java - Java中JToggle选择状态下的滑动抽屉动画?