大家可能会有这样疑问:连接池类似于线程池或者对象池,就是一个放连接的池子,使用的时候从里面拿一个,用完了再归还,功能非常简单,有什么可讲的。
可能还会有这样的疑问:高性能这么高大上,一个小小的连接池,如何跟高大上靠上边的。
本主题将会全面介绍连接池原理,高性能的设计,优化实践,现有连接池的瓶颈及解决方案。同时也会介绍唯品会自研数据库连接池产品(代号:Caelus)
为什么要有连接池
先看一下连接池所处的位置:
应用框架的业务实现一般都会访问数据库,缓存或者HTTP服务。为什么要在访问的地方加上一个连接池呢?
下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。
TCP建立连接的三次握手
MySQL认证的三次握手
真正的SQL执行
MySQL的关闭
TCP的四次握手关闭
可以看到,为了执行一条SQL,却多了非常多我们不关心的网络交互。
优点:实现简单。
缺点:
网络IO较多
数据库的负载较高
响应时间较长及QPS较低
应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁
在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)
使用连接池流程
第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接。
优点:
较少了网络开销
系统的性能会有一个实质的提升
没了麻烦的TIME_WAIT状态
当然,现实往往是残酷的,当我们解决了一个问题的时候,同时伴随着另外一个问题的产生。
使用连接池面临的最大挑战:连接池的性能
连接数和线程数性能优化
分库DB部署结构:
假设有128个分库:32个服务器,每个服务器有4个sche