java数据库连接池过多_高性能数据库连接池的内幕

大家可能会有这样疑问:连接池类似于线程池或者对象池,就是一个放连接的池子,使用的时候从里面拿一个,用完了再归还,功能非常简单,有什么可讲的。

可能还会有这样的疑问:高性能这么高大上,一个小小的连接池,如何跟高大上靠上边的。

本主题将会全面介绍连接池原理,高性能的设计,优化实践,现有连接池的瓶颈及解决方案。同时也会介绍唯品会自研数据库连接池产品(代号:Caelus)

为什么要有连接池

先看一下连接池所处的位置:

90b688d49f77398529baf9416e46c0ce.png

应用框架的业务实现一般都会访问数据库,缓存或者HTTP服务。为什么要在访问的地方加上一个连接池呢?

下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。

973acf81ba4864b58bef1a7bf7274547.png

TCP建立连接的三次握手

MySQL认证的三次握手

真正的SQL执行

MySQL的关闭

TCP的四次握手关闭

可以看到,为了执行一条SQL,却多了非常多我们不关心的网络交互。

优点:实现简单。

缺点:

网络IO较多

数据库的负载较高

响应时间较长及QPS较低

应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁

在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)

使用连接池流程

bd76da09e4bf7f9e5dadf57dfb97eae2.png

第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接。

优点:

较少了网络开销

系统的性能会有一个实质的提升

没了麻烦的TIME_WAIT状态

当然,现实往往是残酷的,当我们解决了一个问题的时候,同时伴随着另外一个问题的产生。

使用连接池面临的最大挑战:连接池的性能

连接数和线程数性能优化

分库DB部署结构:

c5dc8d977d5be780e4abc1fe3a2e03ea.png

假设有128个分库:32个服务器,每个服务器有4个sche

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值