数据库连接池详解:原理+常用连接池
一、连接池的基本概念
1.什么是连接池?
数据库连接池负责分配、管理和释放数据库连接,其基本思想就是为数据库建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕后再放回去。
可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量和使用情况,为系统开发和测试及性能调整提供依据。
(1)使用连接池的原因:创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP的四次握手,造成的开销是不可忽视的),因此是为了提升系统访问数据库的性能。典型的用空间换取时间的策略(浪费了空间存储连接,但是节省了创建和释放连接的时间)。
(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)连接池主要参数:
- 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
- 最大连接数:是连接池能申请的最大连接数,如果连接请求超过次数,新的连接请求会被加入到等待队列中。
- 最大空闲时间:当连接长时间没有向服务器发送请求时,断开连接。
- 获取连接超时时间:是指当连接数超过连接池的最大连接数且没有空闲连接时,等待的最大时间;超时则抛出异常。
- 超时重试连接次数
(3)连接池需要注意的问题:
- 并发问题:多线程问题,可以使用synchronized关键字等确保同步。
- 事务处理:事务具有原子性,多个线程共用一个Connection连接对象时,无法确定操作对应的事务。为避免相关问题,可以每个事务独占一个连接来实现。
- 连接池的分配与释放:连接池的分配与释放,对系统的性能有很大的影响。对于连接的管理可使用一个List进行统一管理。
- 连接池的配置和维护:系统采用最小连接数和最大连接数等参数来控制连接池中的连接。最小连接数创建过多,则系统启动慢,但创建后系统的相应速度会很快;创建少则反之。
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。
Druid配置详解见:https://www.cnblogs.com/cymiao/p/8432681.html
Druid实例见:https://blog.csdn.net/h294590501/article/details/80428182
优点 | 缺点 | 应用 | |
C3P0 |
1.功能简单易用 2.稳定性好 |
1.性能非常差 2.构涉及过于复杂,使得重构十分复杂 |
Hibernate |
DBCP (Apache) |
1.最核心的池依赖于Apache的另一个项目Commons的Pool,版本更迭完全依托于Pool项目 | ||
HikariCP (性能无敌) |
1.性能强劲,稳定性好(原因如下) ①字节码精简:代码优化 ②优化代理和拦截器:减少代码 ③自定义数组类型:FastStatement List代替ArrayList,避免每次get()进行range check,避免remove()的全扫描 ④自定义类型集合:ConcurrentBag ,提高并发读写的效率 ⑤其他缺陷的优化 |
||
Druid (功能全面) |
1.功能全面:集成连接池、SQL监控、黑名单拦截等功能 2.强大的监控特性,可以清晰的知道连接池和SQL的工作情况 3.方便扩展:提供了Filter-Chain模式的API,可以自己编写Filter拦截JDBC中的任何方法 4.集合了开源和商业数据库连接池的优秀特性,并结合阿里的大规模苛刻生产环境的使用经验进行优化。 |
阿里的项目 |
本文部分内容参考博客,https://blog.csdn.net/crankz/article/details/82874158
数据库连接池详解:原理+常用连接池相关推荐
- Mysql连接池详解——原理部分
引言 为什么要使用连接池 线程池如何配合连接池使用, 连接池和线程池数量 不能根据经验值直接设置,需要根据io同步的具体时间去测试得到最优的值 同步连接池和异步连接池的区别 连接池的扩展 一.池化技术 ...
- 数据库连接池原理详解与自定义连接池实现
实现原理 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的 ...
- OkHttp3源码详解(五) okhttp连接池复用机制
1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...
- mysql连接池的工作原理_连接池工作原理
连接池工作原理 连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用.分配和管理策略,使得该连接池中的连接可以得到高效.安全的复用,避免了数据库连接频繁建立.关闭的开销. 连接池的 ...
- 详解SpringBoot配置连接池
内置的连接池 目前spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池. 数据库连接可以使用DataSource池进行自动配置. 由于Tomcat数 ...
- ScheduledThreadPoolExecutor()定时执行线程池详解,java线程池
为什么80%的码农都做不了架构师?>>> package com.dy.pool;import java.util.concurrent.ExecutorService; im ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- 数据库连接池原理及常用连接池介绍
一.背景介绍 1.1 什么是连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个. 1.2 为什么要使用连接池 数据库连接是一种关键的有 ...
- 数据库连接池学习笔记(一):原理介绍+常用连接池介绍
什么是连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个. 为什么要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户 ...
- Spring Boot 使用 Druid 连接池详解
Spring Boot 使用 Druid 连接池详解 Alibaba Druid 是一个 JDBC 组件库,包含数据库连接池.SQL Parser 等组件,被大量业务和技术产品使用或集成,经历过严苛的 ...
最新文章
- 常用的 Web Service 服务汇总(天气预报,列车时刻表)
- django1.4.9 pythoon manage.py --help 子命令解析
- c语言小游戏贪吃神,[原创]自己编的一个贪吃蛇小游戏
- python实战===如何优雅的打飞机
- PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
- 修改vant 弹窗Dialog组件调用是确认按钮与取消按钮的文字
- 华为云计算机访问手机软件,华为云电脑来了,只需一个APP就能让手机秒变Windows电脑!...
- 操作系统在内存中的位置
- Source Insight 生成函数调用关系图
- ElasticSearch全文搜索引擎之Aggregation聚合查询(结合Kibana)
- 蓝牙小钢炮 - Bose 博士 Revolve 蓝牙音箱使用感受
- 在Mac上修改jupyter默认地址
- NLP(二):n元模型
- 广西来宾中考计算机考试考什么,来宾中考信息管理系统 http://www.lbzklq.com
- 3行代码Python解决图片清晰度识别,原来我们看到的不一定是这样
- 计算机pu代表什么意思,pu是什么意思
- 判断dataGridView是否重复值
- java音乐播放器视频_java 实现音乐播放器的简单实例
- 1252:走迷宫 2021-01-05
- 算法训练 - 筛选号码 (有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。)
热门文章
- 宇视网络摄像机存储功能配置指导
- vue:antV G2在vue中的使用(阿里图表,类似echarts)
- java 切面 不执行,Spring AOP 切面没有执行
- 在Spring AOP切面中启用新事务
- lol新加坡服务器中英文文件,lol手游新加坡服中文补丁
- JAVA字符编码:Unicode,GBK,GB2312,UTF-8
- 云服务综合解决方案——云桌面
- 图像识别的原理、过程、应用前景,精华篇!
- [有源滤波器]Sallen-key开关电容电路(二阶低通滤波器)
- iOS逆向专栏总目录(持续更新)