阻塞调用如何像Jetty Non Blocking IO servlet在内部处理数据库访问?

我已经阅读了大量的材料来尝试和清楚地了解Jetty Non Blocking Web应用程序服务器可以或不可以提供的收益。

到目前为止,我所了解的(部分是通过引用这个: Jetty和其他容器如何在坚持Servlet规范的同时利用NIO )是因为使用非阻塞IO模型,像Jetty这样的Web服务器运行一个(或每个CPU核心)线程 – select器线程 – 确定为一些I / O准备好的连接。 准备好一些I / O的连接将被分派到内部线程池进行处理,以处理请求。

我可以看到,这样的架构可以让您以更less的资源为更多的连接提供服务。 不过,我不清楚的是这样的:

如果我使用执行阻塞I / O的标准JDBC驱动程序编写了运行长时间运行的数据库操作的servlet,那么处理程序线程是否不会从池中分派来处理此请求块?

如果请求的速度超过了数据库请求的执行速度,那么处理程序线程池会耗尽一些时间?

所以对于像这样的应用程序,是否有任何好处在一个非阻塞docker的networking服务器上运行? 如果servlet本身对数据库使用了另一层非阻塞访问权限,那么是否真正产生了非阻塞性的好处呢? 还是有什么我失踪?

请说明是否有一些魔术通过它将阻止数据库操作比阻塞的Web服务器支付更less的代价。

PS:为了对比,我在这里阅读了关于Node.js的内容 – 单线程非阻塞IO模型如何在Node.js中工作 – 似乎表明Node在下面使用libuv并应用其他技术来翻译代码中的所有阻塞操作(例如数据库访问和sleep() )到事件callback,确保事件循环和内部线程池永远不会阻塞阻塞callback。 尽pipe对我来说还是有点狼狈的,但是假设Node对了,Jetty可以承诺吗? 对于不是以非阻塞方式写入的servlet,也是如此?

Interesting Posts