mysql的社区版中采用的连接方法就是One-Connection-Per-Thread,这种方式最大的问题在于,当连接数非常多时,线程上下文切换成本高(mongodb也为每个连接创建一个线程,有一个listener线程会使用select监听端口,监听到连接时就创建一个线程为该连接服务)。从mysql5.6商业版开始提供Pool-Threads模式,即使用线程池来处理客户端的连接,mariadb中也引入了这种机制。
下图就是Pool-Threads的模型结构,将线程池分为若干个Group,每个Group持有若干个worker线程、一个listener线程、两个队列。listener线程用于监听连接,worker线程用于处理连接请求,优先队列用于排队优先级高的连接(已经开启事务、获得锁的连接),普通队列用于排队普通连接。一个连接只可能在一个group中得到处理,但可以被group中不同的线程处理(线程池服务的最小单位是语句)。
下图表达了client(web server)通过连接池向server发请求,server的线程池中有3个group,每个group有1个worker线程。
参考:http://www.cnblogs.com/cchust/p/4510039.html
mariadb Threadpool Benchmarks : https://mariadb.com/kb/en/the-mariadb-library/threadpool-benchmarks/,在并发量大时,线程池要比One-Connection-Per-Thread好很多(图中纵坐标应该是每秒事务处理数吧)。