连接池的介绍一

    经过最近的一些面试情况以及跟团队成员的沟通和培训,发现现在还有很大一部分人对连接池是什么还不明白。今天我们就来聊聊 !

       因为个人觉得这部分内容还是蛮重要的!

       首先我们从单个的连接讲起,后面会重点考察下单连接和连接池的区别!

后续我会继续发文然后探讨在大型互联网集群项目中连接池会遇到的问题,以及对应的处理方法。

 

什么是连接池?出现的原因是啥?

       当应用之间需要进行数据通信时。

首先需要建立与服务器之间的一个连接状态,连接建立后会分配一个线程或者进程来调度,然后完成相关解析并生成执行计划

然后才进入执行阶段,读取必要的数据到内存并逻辑处理

最后才通过之前创建的连接发送结果集给到客户端,关掉连接并释放资源,所以连接可以说是应用之间交互的桥梁和管道。

       可惜这个桥梁的构建和销毁,对与服务器来说是资源消耗很大的操作,这里会涉及到CPU的运算,资源的争用,内存的分配, socket的建立等,频繁的创建连接和销毁连接,对服务器来讲是不可接受的,所以在某些情况下长连接显然比短连接更适合(比如数据库的查询操作)

       这时候就出现了连接池,来对整个生命周期中连接的创建和销毁这个环节进行优化,有了连接池,我们就能做到连接复用,维护连接对象,做分配,管理和释放,也就能减少平均连接时间,有了连接池,同时能避免应用创建大量的连接到服务器而引发的各种问题,通过请求排队,来缓冲应用对服务器的冲击。



 

大家现在可以想象一下对连接池的基本操作,无非就是申请连接,从连接池中获取连接,再执行业务处理的逻辑完成后,把连接放回到池中。

 

在一般情况下一个连接池在启动的时候我们可以会初使化几个属性MIN连接数,MAX连接数,当启动时连接池中已建起了一部分连接,如果一个请求获取连接的时候发现有空闲的连接, 那么直接可以拿来用了, 如果所有的连接都在忙,但连接池的数量还没有达到MAX连接数, 那么不需要等待,直接申请创建一个新的连接,用完了再把他放回去,当发现没有空闲的连接时, 并且活跃的连接已经到达MAX连接数了, 那么这时候你只能选择暂时等待,等待的时间取决于block-timeout 在这等待期间如果有连接空闲下来, 那么你就可以拿到这个连接, 如果超出等待时间还没有拿到连接,那么就抛出个拿不到连接的异常。

 

以上就是连接池的一些基本的逻辑,另外的功能无非就是对连接池使用状态的监控,比如一个连接如果空闲下来了,多久没有使用需要被关闭,比如哪些错误情况下需要重新创建一下连接再放入池子,比如如何定时来验证连接是否有效,等等。

 

上面我提出了连接池的MINMAX连接,需要大家注意了。因为连接池本身是无法感知服务器运行情况以及负载的,所以我们需要通过经验和计算来合理设置相关值,这对于服务器这间的通信来说是非常重要的,我们应该尽量做到即能发挥出服务器的最大能力,也能有效利用数据库的连接资源和处理能力。

 

那么我们应该怎么设置MINMAX的值了?

如果连接池MIN设置过小的话,在应用业务量突增或者启动时,就可能短时间内产生连接风暴,这对于服务器会产生不小的冲击,但是如果MIN值设置过大,就会出现服务器的连接过剩的情况, 连接一方面超出空闲时间被销毁,而销毁后发现又小于MIN连接数, 又开始创建, 结果就发生循环, 浪费资源浪费电。

如果连接池MAX值设置过大,在极端情况下,当应用发生异常时,会导致连接数被撑到MAX值,有可能导致服务器的连接数被耗尽,或者超出服务器的处理能力,进而导致业务受到影响。并且当连接数被撑到MAX值,在获取连接等待超时的时候,应用的线程池也有可能受到影响,会形成一系列的连锁反应,乃至雪崩。

 

所以加在MAX值是,我们需要观察下提供服务的服务器是否还有余量,

如果有余量,那么加大也只是一种临时的解决方法。

如果没有余量,那么加大那么只会放更多的请求到提供服务的服务器,那么只会让性能变得更差。

比如:按照连接池默认的配置MAX10,一百台应用服务器连接一个处理服务器,那么会有1000个连接落到这台服务器上,按照一个请求的处理时间2ms的话, 那么一秒钟就能处理500个请求,1000个连接的话可以处理50wqps/tps请求了,这时候就已经远远超出单个服务器的容量极限了。

 

那么我们把block-timeout的时间改长, 尽可能的提高拿到连接的概率,岂不是挺好?

嘿嘿,这样也是不靠谱的,因为当应用并发很高的时候,大大超过连接池最大值, block-timeout也不能起到缓冲作用,返而会阻塞应用线程,大量的积压线程会导致应用直接挂了。所以这个等待的时间也不是越长越好,而需要从应用的维度去评估一下,并建立好容错机制。

通过以上分析的两点,有心的童鞋可能已经发现了,在这里的关键之处是,怎么提高响应时间,就是怎么提升服务器的处理能力,让每个事务做到尽可能的短,这样才能进一步做到连接得用,提高连接池的效率,进而缩知请求的时间。

猜你喜欢

转载自longxy520.iteye.com/blog/2259458