数据库连接池详解:原理+常⽤连接池
⼀、连接池的基本概念
1.什么是连接池?
数据库连接池负责分配、管理和释放数据库连接,其基本思想就是为数据库建⽴⼀个“缓冲池”,预先在缓冲池中放⼊⼀定数量的连接,当需要建⽴数据库连接时,只需从“缓冲池”中取出⼀个,使⽤完毕后再放回去。
可以通过设定连接池最⼤连接数来防⽌系统⽆尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量和使⽤情况,为系统开发和测试及性能调整提供依据。
(1)使⽤连接池的原因:创建连接和释放连接都有很⼤的开销(尤其是数据库服务器不在本地时,每次建⽴连接都需要进⾏TCP的三次握⼿,释放连接需要进⾏TCP的四次握⼿,造成的开销是不可忽视的),因此是为了提升系统访问数据库的性能。典型的⽤空间换取时间的策略(浪费了空间存储连接,但是节省了创建和释放连接的时间)。
druid连接池配置详解(2)不使⽤连接池的流程:
连接池的TCP连接、数据库认证、数据库关闭、Tcp关闭步骤会复⽤。
(3)普通连接与连接池的⽐较:
优点 缺点
普通连接 1.实现简单1.⽹络IO较多
2.数据库的负载较⾼
3.响应时间较长及QPS每秒查询率较低
4.应⽤频繁的创建连接和关闭连接,导致临时对象较多,GC垃圾回收频繁
5.关闭连接后,会出现⼤量
TIME_WAIT的TCP状态
连接池1.较少的⽹络开销
2.系统的性能会有⼀个实质的提升
3.没有⼤量⿇烦的TIME_WAIT状态
2.⼯作原理
(1)连接步骤:①连接池的建⽴;②连接池中连接的使⽤管理;③连接池的关闭
第⼀、连接池的建⽴。⼀般系统初始化时,连接池会根据系统配置建⽴,并在池中创建了⼏个连接对
象,以便使⽤时能从连接池中获取。池中的连接不能随意创建和关闭。Java中提供了很多容器类可以⽅便的构建连接池,例如Vector、Stack等。
第⼆、连接池的管理。连接池管理策略是连接池机制核⼼,对性能有很⼤影响。管理策略:当客户请求数据库连接时,⾸先查看连接池中是否有空闲连接,1)如果存在空闲连接,则使⽤空闲连接;2)如果没有空闲连接,则查看当前所开的连接数是否已经达到了最⼤连接数,如果没达到就重新创建⼀个连接给请求的客户;3)如果达到就按设定的最⼤等待时间进⾏等待,如果超出最⼤等待时间,则抛出异常给客户。
第三、连接池的关闭。当应⽤程序退出时,关闭连接池中所有的连接,释放连接池相关资源,和创建过程相反。
(2)连接池主要参数:
1. 最⼩连接数:是连接池⼀直保持的数据库连接,所以如果应⽤程序对数据库连接的使⽤量不⼤,将会有⼤量的数据库连接资源被浪
费。
2. 最⼤连接数:是连接池能申请的最⼤连接数,如果连接请求超过次数,新的连接请求会被加⼊到等
待队列中。
3. 最⼤空闲时间:当连接长时间没有向服务器发送请求时,断开连接。
4. 获取连接超时时间:是指当连接数超过连接池的最⼤连接数且没有空闲连接时,等待的最⼤时间;超时则抛出异常。
5. 超时重试连接次数
(3)连接池需要注意的问题:
1. 并发问题:多线程问题,可以使⽤synchronized关键字等确保同步。
2. 事务处理:事务具有原⼦性,多个线程共⽤⼀个Connection连接对象时,⽆法确定操作对应的事务。为避免相关问题,可以每个事务
独占⼀个连接来实现。
3. 连接池的分配与释放:连接池的分配与释放,对系统的性能有很⼤的影响。对于连接的管理可使⽤⼀个List进⾏统⼀管理。
4. 连接池的配置和维护:系统采⽤最⼩连接数和最⼤连接数等参数来控制连接池中的连接。最⼩连接数创建过多,则系统启动慢,但创
建后系统的相应速度会很快;创建少则反之。
3.数据库连接池产品
(⼀代连接池)C3P0、DBCP、(⼆代连接池)Druid、HikariCP,⼀⼆代产品区分最重要的特征是架构和设计时采⽤的线程模型。⼀般来讲采⽤单线程同步的架构设计都属于第⼀代连接池,采⽤多线程异步架构的则属于第⼆代。
(1)C3P0:Hibernate曾将其作为内置的数据库连接池,稳定性的到业内认可。功能简单易⽤,稳定性好;但是性能⾮常差,且架构涉及过于复杂,重构⼗分复杂
(2)DBCP:DataBase Connection Pool,属于Apache顶级项⽬Commons中的核⼼⼦项⽬,在Apache⽣态圈中影响⼗分⼴泛。DBCP并不是独⽴实现连接池功能的,它内部依赖于Commons中的另⼀个⼦项⽬Pool,连接池最核⼼的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能(因此DBCP只能做⼩版本更新,真正⼤版本更迭则完全依托于pool)。DBCP1.x版本⼀直延续着单线程设计模式,2.x版本才采⽤多线程(2.x版本已经稳稳达到了和新⼀代产品同级别的性能指标)
(3)HikariCP(性能⽆敌):性能极好,具体性能⽐较见下⾯总结表格。
(4)Druid(功能全⾯):阿⾥优秀开源项⽬中的⼀个,除此外还有众多,如fastJson、dubbo项⽬、AliSQL软件等。除了提供性能卓越的连接池性能外,还集成了SQL监控,⿊名单拦截等功能。Durid是“为监控⽽⽣”。它不仅仅是⼀个数据库连接池,还包含了ProxyDriver,⼀系列内置的JDBC组件库,⼀个SQL Parser。
优点 缺点 应⽤
C3P01.功能简单易⽤
2.稳定性好
1.性能⾮常差
2.构涉及过于复杂,使得重构⼗分复杂Hibernate
DBCP
(Apache)
1.最核⼼的池依赖于Apache的另⼀个项⽬
Commons的Pool,版本更迭完全依托于Pool项⽬
1.性能强劲,稳定性好(原因如下)
①字节码精简:代码优化
HikariCP (性能⽆敌)②优化代理和:减少代码
③⾃定义数组类型:FastStatement List代替ArrayList,避免每次get()进⾏range check,避免remove()的全扫描
④⾃定义类型集合:ConcurrentBag ,提⾼并发读写的效率
⑤其他缺陷的优化
Druid (功能全⾯)1.功能全⾯:集成连接池、SQL监
控、⿊名单拦截等功能
2.强⼤的监控特性,可以清晰的知道
连接池和SQL的⼯作情况
3.⽅便扩展:提供了Filter-Chain模式
的API,可以⾃⼰编写Filter拦截JDBC
中的任何⽅法
4.集合了开源和商业数据库连接池的
优秀特性,并结合阿⾥的⼤规模苛刻
⽣产环境的使⽤经验进⾏优化。
阿⾥的项⽬
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论