今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO
多路复用被视为是非常好的性能助力器。但是一般我们在使用 DB 时,还是经常性采用c3p0
,tomcat connection pool
等技术来与 DB 连接,哪怕整个程序已经变成以Netty
为核心。这到底是为什么?
首先纠正一个常见的误解。IO多路复用听上去好像是多个数据可以共享一个IO(socket连接),实际上并非如此。「IO多路复用不是指多个服务共享一个连接,而仅仅是指多个连接的管理可以在同一进程」。在网络服务中,IO多路复用起的作用是「一次性把多个连接的事件通知业务代码处理」。至于这些事件的处理方式,到底是业务代码循环着处理、丢到队列里,还是交给线程池处理,由业务代码决定。
对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。
为什么并