`

连接池的介绍一

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

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

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

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

 

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

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

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

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

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

       可惜这个桥梁的构建和销毁,对与服务器来说是资源消耗很大的操作,这里会涉及到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也不能起到缓冲作用,返而会阻塞应用线程,大量的积压线程会导致应用直接挂了。所以这个等待的时间也不是越长越好,而需要从应用的维度去评估一下,并建立好容错机制。

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

  • 大小: 7.6 KB
分享到:
评论

相关推荐

    常用四大连接池集合

    常用四大连接池集合c3p0,dbcp,druid,HikariCP,内有四大连接池的使用方法,配置方法,以及它们之间的比较和介绍,和spring继承等配置方法。 c3p0 太古老,代码及其复杂,不利于维护。貌似都比它强。 dbcp 是 ...

    基于Java数据库连接池的研究与创新

    本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了一种改进的新型连接池方法,最后基于Java语言对四种连接方法进行了仿真模拟。通过实验测试及连接时间的对比分析,看到...

    详解:WebSphere中流行数据库连接池的配置

    本文介绍WebSphere下Oracle、SQL Server、Sybase、MySQL数据库连接池的配置方法,并给出相应调用连接池的示例。相对于Weblogic,WebSphere连接池的配置要稍微复杂一些,因为缺少相关的文档,需要一定的技巧和经验。...

    Web性能测试之连接池介绍

    Web性能测试之连接池介绍,在性能测试过程中,系统支持的并发数是我们重点关注的指标之一,影响系统所能支持的并发数的因素非常多。

    Tomcat5.5连接池配置案例

    一个jsp案例,介绍Tomcat5.5连接池的配置,内有案例笔记供参考,新手也能一看就会

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil....

    高性能的分布式数据库连接池clearpool.zip

    clearpool有着良好的性能,因为它最大程度地复用了数据库连接池的连接。 clearpool的功能: 有效地管理分布式数据库。 支持分布式事务。 可以监控数据库池状态。  能够在数据库重启...

    在MyEclipse中使用Weblogic数据库连接池技术

    在上一篇中介绍了任何在Eclipse中使用JBoss数据库连接池技术,现在介绍一下在MyEclipse中使用Weblogic数据库连接池技术。

    Tomcat6连接池配置详解(自动重连)

    详细介绍Tomcat6的连接池配置,且数据库断开连接池可以自动重连,一看便会。

    基于JAVA JSP数据库连接池的研究与实现的毕业设计,使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据

    文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结了一些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为...

    一种基于JSP数据库连接池的研究与实现(含jsp源码和文章说明和数据库).rar

    并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略,在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易

    c3p0连接池

    经过测试时可以用的,博文有有一篇是介绍c3p0,有问题欢迎提出。

    java编写数据库连接池实例

    关于数据库连接池,本文介绍了一种写法。通过继承接口的方式,采用类似builder模式来实现单库连接的连接池。详细写法见以下的四个类。

    JDBC连接池(转发)

    本文介绍了基于JDBC的数据库连接池的工作原理,阐述了连接池技术的事务处理、多数据库服务器等各项关键技术,提出了一个高效的连接池管理策略,最后详细说明了数据库连接池应用的具体实现过程。 我觉得很有启发,...

    Domino连接池解决方案

    本文只简单介绍了Domino与Oracle交互的基本方法,没有...文中使用了连接池,在本文中并没有具体介绍连接池的设计方案,在下一篇文章中将会就具体连接池设计方案作个说明!本文只做技术探讨之用,对文中的错误欢迎指正。

    Spring Boot与HikariCP:性能卓越的数据库连接池

    本文将详细介绍Spring Boot中如何使用HikariCP作为数据库连接池,包括其工作原理、优势分析、配置步骤以及代码示例。通过本文,读者将能够轻松集成HikariCP到Spring Boot项目中,从而提高数据库连接的性能和效率。 ...

    数据库连接池实现代码

    这个代码很详细的介绍了如何创建一个数据库连接池,不过这只是适合于Oracle数据库

    golang实现基于channel的通用连接池详解

    golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池。下面话不多说了,来一起看看详细的介绍吧。 功能 * 连接池中连接类型为interface{},使得更加通用 * 链接的最大...

    tomcat/resin使用全局数据库连接池资源

    我比较倾向于直接在web应用...  也是说我们希望每个应用服务器只有一个连接池的实例,在这个应用服务器上运行的所有项目都可以使用这个连接池,下面介绍这种方式在Tomcat和Resin下的配置。  Tomcat使用JNDI Resourc

    Domino連接池解決方案

    本文只简单介绍了Domino与Oracle交互的基本方法,没有...文中使用了连接池,在本文中并没有具体介绍连接池的设计方案,在下一篇文章中将会就具体连接池设计方案作个说明!本文只做技术探讨之用,对文中的错误欢迎指正。

Global site tag (gtag.js) - Google Analytics