因为个人觉得这部分内容还是蛮重要的!
首先我们从单个的连接讲起,后面会重点考察下单连接和连接池的区别!
后续我会继续发文然后探讨在大型互联网集群项目中连接池会遇到的问题,以及对应的处理方法。
什么是连接池?出现的原因是啥?
当应用之间需要进行数据通信时。
首先需要建立与服务器之间的一个连接状态,连接建立后会分配一个线程或者进程来调度,然后完成相关解析并生成执行计划
然后才进入执行阶段,读取必要的数据到内存并逻辑处理
最后才通过之前创建的连接发送结果集给到客户端,关掉连接并释放资源,所以连接可以说是应用之间交互的桥梁和管道。
可惜这个桥梁的构建和销毁,对与服务器来说是资源消耗很大的操作,这里会涉及到CPU的运算,资源的争用,内存的分配, socket的建立等,频繁的创建连接和销毁连接,对服务器来讲是不可接受的,所以在某些情况下长连接显然比短连接更适合(比如数据库的查询操作)。
这时候就出现了连接池,来对整个生命周期中连接的创建和销毁这个环节进行优化,有了连接池,我们就能做到连接复用,维护连接对象,做分配,管理和释放,也就能减少平均连接时间,有了连接池,同时能避免应用创建大量的连接到服务器而引发的各种问题,通过请求排队,来缓冲应用对服务器的冲击。
大家现在可以想象一下对连接池的基本操作,无非就是申请连接,从连接池中获取连接,再执行业务处理的逻辑完成后,把连接放回到池中。
在一般情况下一个连接池在启动的时候我们可以会初使化几个属性MIN连接数,MAX连接数,当启动时连接池中已建起了一部分连接,如果一个请求获取连接的时候发现有空闲的连接, 那么直接可以拿来用了, 如果所有的连接都在忙,但连接池的数量还没有达到MAX连接数, 那么不需要等待,直接申请创建一个新的连接,用完了再把他放回去,当发现没有空闲的连接时, 并且活跃的连接已经到达MAX连接数了, 那么这时候你只能选择暂时等待,等待的时间取决于block-timeout, 在这等待期间如果有连接空闲下来, 那么你就可以拿到这个连接, 如果超出等待时间还没有拿到连接,那么就抛出个拿不到连接的异常。
以上就是连接池的一些基本的逻辑,另外的功能无非就是对连接池使用状态的监控,比如一个连接如果空闲下来了,多久没有使用需要被关闭,比如哪些错误情况下需要重新创建一下连接再放入池子,比如如何定时来验证连接是否有效,等等。
上面我提出了连接池的MIN和MAX连接,需要大家注意了。因为连接池本身是无法感知服务器运行情况以及负载的,所以我们需要通过经验和计算来合理设置相关值,这对于服务器这间的通信来说是非常重要的,我们应该尽量做到即能发挥出服务器的最大能力,也能有效利用数据库的连接资源和处理能力。
那么我们应该怎么设置MIN和MAX的值了?
如果连接池MIN设置过小的话,在应用业务量突增或者启动时,就可能短时间内产生连接风暴,这对于服务器会产生不小的冲击,但是如果MIN值设置过大,就会出现服务器的连接过剩的情况, 连接一方面超出空闲时间被销毁,而销毁后发现又小于MIN连接数, 又开始创建, 结果就发生循环, 浪费资源浪费电。
如果连接池MAX值设置过大,在极端情况下,当应用发生异常时,会导致连接数被撑到MAX值,有可能导致服务器的连接数被耗尽,或者超出服务器的处理能力,进而导致业务受到影响。并且当连接数被撑到MAX值,在获取连接等待超时的时候,应用的线程池也有可能受到影响,会形成一系列的连锁反应,乃至雪崩。
所以加在MAX值是,我们需要观察下提供服务的服务器是否还有余量,
如果有余量,那么加大也只是一种临时的解决方法。
如果没有余量,那么加大那么只会放更多的请求到提供服务的服务器,那么只会让性能变得更差。
比如:按照连接池默认的配置MAX为10,一百台应用服务器连接一个处理服务器,那么会有1000个连接落到这台服务器上,按照一个请求的处理时间2ms的话, 那么一秒钟就能处理500个请求,1000个连接的话可以处理50w的qps/tps请求了,这时候就已经远远超出单个服务器的容量极限了。
那么我们把block-timeout的时间改长, 尽可能的提高拿到连接的概率,岂不是挺好?
嘿嘿,这样也是不靠谱的,因为当应用并发很高的时候,大大超过连接池最大值, block-timeout也不能起到缓冲作用,返而会阻塞应用线程,大量的积压线程会导致应用直接挂了。所以这个等待的时间也不是越长越好,而需要从应用的维度去评估一下,并建立好容错机制。
通过以上分析的两点,有心的童鞋可能已经发现了,在这里的关键之处是,怎么提高响应时间,就是怎么提升服务器的处理能力,让每个事务做到尽可能的短,这样才能进一步做到连接得用,提高连接池的效率,进而缩知请求的时间。
相关推荐
1. C3P0:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0提供了很多可配置的参数来调整连接池的性能。 2. DBCP (Apache BasicDataSource):Apache Commons DBCP是...
本文将详细介绍 Tomcat 连接池配置的步骤和原理,帮助读者快速掌握 Tomcat 连接池的使用。 一、Tomcat 连接池配置的必要性 在 Web 应用程序中,数据库连接池是必不可少的组件,它可以大大提高数据访问的速度和安全...
1. **C3P0** 是一个开源的JDBC连接池,提供了数据库连接的自动获取、释放和管理功能。在使用C3P0时,我们需要在配置文件中设置相关参数,如初始连接数、最大连接数等,并在代码中加载这些配置,创建PoolConfig对象,...
当应用程序需要使用数据库连接时,可以从连接池中获取一个连接,使用完毕后再将其归还给连接池,而不是关闭连接。这样可以减少数据库的连接和关闭操作,降低系统开销。 在Tomcat服务器中配置数据源和连接池涉及到几...
下面将详细介绍这两种连接池的使用以及它们的配置参数。 1. **Apache DBCP (BasicDataSource)** Apache的DBCP是Spring早期常见的连接池实现。在示例配置中,可以看到`<bean>`标签定义了一个名为`dataSource`的...
视频教程可能会详细介绍上述知识点,并通过实际案例演示如何在Java项目中集成和配置连接池,帮助开发者更好地理解和应用连接池技术。通过学习这个教程,你可以掌握如何有效管理数据库连接,提升系统性能,以及如何...
下面,我们将介绍如何在 GlassFish 管理员界面中配置连接池,特别是使用 Oracle 数据库为例。 连接池的概念 ------------- 连接池是一种提高应用程序性能和可靠性的技术,它可以将多个数据库连接组合成一个池,...
本文将详细介绍一个连接多种数据库的连接池封装包,包括其功能、实现方式以及如何使用。 标题中的“一个连接多种数据库的连接池封装包”指的是一个能够支持MySQL、SQL Server和Oracle等主流关系型数据库的通用连接...
本文将详细介绍如何在Tomcat 6中配置数据库连接池,并通过实际案例进行演示。 #### 二、配置步骤详解 ##### 2.1 修改`server.xml`文件 首先,我们需要打开Tomcat安装目录下的`conf`文件夹,找到`server.xml`文件...
本文将详细介绍C#中数据库连接池的工作原理、优点以及如何在实际项目中应用。 首先,我们来理解数据库连接池的基本概念。数据库连接池是一组预先初始化的数据库连接,当程序需要与数据库建立连接时,可以从池中获取...
1. `acquireIncrement`:当连接池中的连接耗尽时,一次同时尝试获取的连接数。默认值为3,意味着如果连接池为空,它会一次性尝试获取3个新的连接。 2. `acquireRetryAttempts`:在从数据库获取新连接失败后,重复...
本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些数据源。 首先,我们需要了解JDBC连接池的基本原理。JDBC连接池是在应用启动时预...
1. **连接的创建与维护**:连接池在启动之初就会创建一定数量的数据库连接,并将这些连接放入一个池中。这些连接会在整个应用运行期间保持活动状态,直到应用关闭或显式地销毁连接池。 2. **连接的借用与归还**:当...
本文将详细介绍在Java环境中配置连接池的多种方式,涵盖不同常用的Java框架。 一、C3P0连接池 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。配置C3P0连接池通常需要在...
使用连接池技术时的配置 在本文中,我们将讨论使用连接池技术时的配置,特别是关于 Tomcat、MySQL 和 Eclipse 的数据库连接池配置。 一、开发工具介绍 为了配置连接池,我们需要使用以下开发工具: * Tomcat ...
本资料将详细介绍如何手写一个简单的连接池实现,以帮助理解连接池的工作原理。 在Java中,我们通常使用`java.sql.Connection`接口来代表数据库连接。一个连接池的实现主要包括以下几个核心功能: 1. **初始化配置...