Tomcat有几个连接器可供选择。 我将把APR连接器放在一边,而将重点放在BIO和NIO上。
BIO连接器(阻塞I / O)正在阻塞–它使用线程池,每个线程在该线程池中接收请求,处理请求,响应并返回到该池。 在阻塞操作期间(例如,从数据库读取或调用外部API),线程被阻塞。
NIO连接器(非阻塞I / O) 要复杂一些 。 它使用java NIO库并在请求之间进行多路复用。 它有两个线程池–一个容纳轮询器线程,该轮询器线程处理所有传入的请求,并将这些请求推送到由另一个线程池中的工作线程处理。 两种池大小都是可配置的。
何时选择NIO与BIO取决于使用情况。 如果您大多数情况下都是常规的请求-响应用法,那么这无关紧要,甚至BIO可能也是一个更好的选择(如我之前的基准测试所示 )。 如果您有长期的连接,那么NIO是更好的选择,因为它可以为更多的并发用户提供服务,而无需为每个用户分配阻塞的线程。 轮询线程负责将数据发送回客户端,而工作线程则负责处理新请求。 换句话说,轮询器和工作线程都不会被单个用户阻止和保留。
随着异步处理servlet的引入,拥有上一段中的后一种情况变得更加容易。 也许这就是在Tomcat 8中将默认连接器从BIO切换到NIO的原因之一。记住这一点很重要,尤其是因为它们没有完全更改“默认值”。
默认值始终为“ HTTP / 1.1”,但是在Tomcat 7中“使用自动切换机制选择基于阻塞 Java的连接器或基于APR / native的连接器”,而在Tomcat 8中“使用自动切换”。选择基于非阻塞 Java NIO的连接器或基于APR /基于本机的连接器的机制”。 为了使事情变得更艰难,他们引入了NIO2连接器。 老实说,我不知道默认情况下使用两个NIO连接器之一。
因此,即使您对tomcat配置有所了解,也请记住默认值的这种更改。 (通常,我建议阅读所有属性的文档并在服务器上使用它们)
翻译自: https://www.javacodegeeks.com/2015/07/tomcats-default-connectors.html