Mysql--实战篇--连接池(连接池原理,HikariCP、C3P0、Druid和DBCP等)

连接池(Connection Pool)是数据库应用程序中的一种优化技术,用于管理和复用数据库连接。通过连接池,应用程序可以避免频繁创建和销毁数据库连接的开销,从而提高性能和资源利用率。在Java应用程序中,常用的MySQL连接池实现包括HikariCP、C3P0、Druid和DBCP等。

1、连接池的工作原理

(1)、为什么需要连接池?

每次创建和销毁数据库连接都会涉及到网络通信、认证等操作,这些操作会消耗大量的时间和资源。对于高并发的应用程序来说,频繁创建和销毁连接会导致性能瓶颈。连接池通过预先创建一定数量的数据库连接,并将其放入一个池中供应用程序使用,可以在需要时快速获取连接,使用完毕后归还给池中,避免了频繁的连接创建和销毁操作。

(2)、连接池的基本流程

1、初始化:连接池在项目启动时,根据配置参数创建一定数量的初始连接,并将它们放入池中。
2、获取连接:当应用程序需要与数据库交互时,它会从连接池中获取一个空闲连接。如果池中有可用连接,则直接返回;如果没有可用连接,连接池会根据配置决定是否创建新的连接或等待现有连接释放。
3、使用连接:应用程序使用获取到的连接执行查询或更新操作。
4、归还连接:当应用程序完成数据库操作后,它应该将连接归还给连接池,而不是关闭连接。连接池会负责管理连接的状态,确保它可以被其他请求重用。
5、销毁连接:当连接池中的连接长时间未被使用,或者连接池需要缩减规模时,连接池会销毁一些连接,释放资源。

(3)、连接池的优势

  • 提高性能:减少了连接创建和销毁的开销,特别是在高并发场景下,能够显著提升系统的响应速度。
  • 资源复用:连接池中的连接可以被多个请求复用,减少了数据库服务器的压力。
  • 控制资源:通过设置最大连接数、最小连接数等参数,可以有效控制应用程序对数据库资源的使用,防止连接耗尽。
  • 自动管理:连接池通常会自动处理连接的超时、失效等问题,确保应用程序始终使用健康的连接。

2、常见的MySQL连接池实现

(1)、HikariCP

HikariCP是目前最受欢迎的MySQL连接池实现之一,以其高性能和低延迟著称。它是由Netflix开发并开源的,广泛应用于生产环境。

特点:

  • 高性能:HikariCP的设计非常精简,几乎没有多余的锁竞争,因此性能非常出色。
  • 轻量级:代码量较少,依赖少,启动速度快。
  • 自动连接测试:支持自动检测连接的有效性,确保返回给应用程序的连接是健康的。
  • 泄漏检测:提供了连接泄漏检测功能,可以帮助开发者及时发现未关闭的连接。

示例配置:(application.yml)

spring:datasource:type: com.zaxxer.hikari.HikariDataSourcehikari:maximum-pool-size: 20   最大连接数minimum-idle: 10        最小空闲连接数idle-timeout: 30000     空闲连接的超时时间(毫秒)connection-timeout: 30000   获取连接的超时时间(毫秒)leak-detection-threshold: 60000   连接泄漏检测阈值(毫秒)

(2)、C3P0

C3P0是一个老牌的连接池实现,虽然不如HikariCP高性能,但它仍然是一个稳定的选择,特别适合小型项目或对性能要求不高的场景。

特点:

  • 配置灵活:提供了丰富的配置选项,可以根据不同的需求进行定制。
  • 自动扩展:支持动态调整连接池的大小,根据负载情况自动增加或减少连接数。
  • JDBC 3.0兼容:完全兼容JDBC 3.0规范,支持多种数据库。

示例配置:(application.properties)

spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
spring.datasource.c3p0.maxPoolSize=20
spring.datasource.c3p0.minPoolSize=5
spring.datasource.c3p0.acquireIncrement=5
spring.datasource.c3p0.idleTestPeriod=3000
spring.datasource.c3p0.maxIdleTime=300

(3)、Druid

Druid是阿里巴巴开源的一款数据库连接池,除了基本的连接池功能外,还提供了强大的监控和统计功能,适用于对数据库性能有较高要求的场景。

特点:

  • 性能优异:Druid的性能表现良好,尤其是在高并发场景下,能够有效地管理连接。
  • 监控功能:内置了详细的监控功能,可以实时查看连接池的状态、SQL执行时间、慢查询等信息。
  • SQL注入防护:Druid提供了SQL注入防护功能,增强了安全性。
  • 多数据源支持:支持多数据源配置,适用于复杂的分布式系统。

示例配置:(application.yml)

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1test-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20filters: stat,wall,log4jconnection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

(4)、DBCP

DBCP(Database Connection Pool)是Apache Commons提供的一个连接池实现。它分为两个版本:DBCP 1.x和DBCP 2.x。DBCP 2.x在性能和功能上有了很大的改进,但仍然不如HikariCP和Druid高效。

特点:

  • 简单易用:配置简单,适合小型项目或对性能要求不高的场景。
  • JDBC 4.0兼容:支持JDBC 4.0规范,提供了更多的功能和更好的兼容性。

示例配置(application.properties):

spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.initial-size=5
spring.datasource.dbcp2.max-total=20
spring.datasource.dbcp2.max-idle=10
spring.datasource.dbcp2.min-idle=5
spring.datasource.dbcp2.validation-query=SELECT 1
spring.datasource.dbcp2.test-on-borrow=true

3、连接池的关键配置参数

无论使用哪种连接池实现,以下是一些常见的配置参数,合理设置这些参数可以显著提升连接池的性能和稳定性。

(1)、最大连接数 (maximum-pool-size)

  • 作用:设置连接池中允许的最大连接数。超过这个数量的请求将被阻塞,直到有空闲连接可用。
  • 建议:根据应用程序的并发量和数据库服务器的性能来设置。通常建议设置为10-50之间,具体取决于应用场景。

(2)、最小空闲连接数 (minimum-idle)

  • 作用:设置连接池中保持的最小空闲连接数。当连接池中的空闲连接数低于这个值时,连接池会自动创建新的连接。
  • 建议:根据应用程序的负载情况设置。通常建议设置为5-10之间,确保在高并发时有足够的空闲连接可用。

(3)、空闲连接超时时间 (idle-timeout)

  • 作用:设置空闲连接的超时时间。超过这个时间的多余最小数量的空闲连接将被销毁,以释放资源。
  • 建议:通常设置为30秒到1分钟之间。过短的超时时间可能导致频繁创建和销毁连接,影响性能;过长的超时时间可能导致连接池中存在大量无用的空闲连接。

(4)、获取连接的超时时间 (connection-timeout)

  • 作用:设置从连接池中获取连接的超时时间。如果在指定时间内无法获取到连接,将抛出异常。
  • 建议:通常设置为30秒左右。过短的超时时间可能导致请求失败,影响用户体验;过长的超时时间可能导致请求长时间挂起,影响系统响应速度。

(5)、连接泄漏检测阈值 (leak-detection-threshold)

  • 作用:设置连接泄漏检测的阈值。如果连接在指定时间内未被归还给连接池,将触发警告或日志记录。
  • 建议:通常设置为60秒左右。过短的阈值可能导致误报,过长的阈值可能导致连接泄漏问题未能及时发现。

(6)、连接验证查询 (validation-query)

  • 作用:设置用于验证连接是否有效的SQL语句。连接池会在每次获取连接时执行该查询,确保连接是健康的。
  • 建议:通常设置为SELECT 1,这是一个简单的查询,不会对数据库造成负担。

(7)、测试连接策略

  • test-on-borrow:在从连接池中获取连接时是否进行验证。开启后,每次获取连接时都会执行validation-query,确保连接是健康的。
  • test-on-return:在将连接归还给连接池时是否进行验证。开启后,每次归还连接时都会执行validation-query,确保连接是健康的。
  • test-while-idle:在连接空闲时是否进行验证。开启后,连接池会定期检查空闲连接的有效性,确保连接池中的连接都是健康的。

建议:根据应用场景选择合适的测试策略。通常建议开启test-while-idle,并在必要时开启test-on-borrow,以确保连接的健康性。

4、连接池的最佳实践

为了确保连接池的高效运行和稳定性,建议遵循以下最佳实践:

(1)、合理设置连接池大小

  • 最大连接数:根据应用程序的并发量和数据库服务器的性能来设置。通常建议设置为10-50之间,具体取决于应用场景。
  • 最小空闲连接数:根据应用程序的负载情况设置。通常建议设置为5-10之间,确保在高并发时有足够的空闲连接可用。

(2)、启用连接泄漏检测

连接泄漏是导致连接池耗尽的主要原因之一。通过启用连接泄漏检测功能,可以在连接长时间未归还时触发警告或日志记录,帮助你及时发现和解决问题。

(3)、使用合理的连接验证策略

连接验证可以确保连接池中的连接是健康的,但在频繁验证连接时也会带来一定的性能开销。因此,建议根据应用场景选择合适的验证策略。

  • test-while-idle:定期检查空闲连接的有效性,确保连接池中的连接都是健康的。
  • test-on-borrow:在必要时开启,确保每次获取连接时都是健康的。

(4)、监控连接池的状态

使用监控工具(如Prometheus + Grafana、Micrometer等)可以实时监控连接池的状态,包括当前活跃连接数、空闲连接数、等待连接的请求数等。通过监控这些指标,可以及时发现连接池是否接近耗尽,并采取相应的措施。

(5)、优化SQL查询

连接池的性能不仅仅取决于连接池本身的配置,还与SQL查询的效率密切相关。通过优化SQL查询,减少不必要的查询和事务范围,可以有效降低连接的占用时间,提升系统的整体性能。

(6)、使用合适的连接池实现

不同的连接池实现有不同的性能特点和功能。根据你的应用场景选择合适的连接池实现。
常见连接池如下:

  • HikariCP:如果你追求高性能和低延迟,推荐使用HikariCP。
  • Druid:如果你需要强大的监控和统计功能,推荐使用Druid。
  • C3P0:如果你需要一个简单易用的连接池,且对性能要求不高,可以选择C3P0。
  • DBCP:如果你已经在使用Apache Commons库,可以选择DBCP 2.x,但它的性能不如HikariCP和Druid。

5、总结

连接池是Java应用程序中与数据库交互的重要组件,能够显著提升性能和资源利用率。通过合理配置连接池的参数,启用连接泄漏检测,使用合适的连接验证策略,并监控连接池的状态,可以确保连接池的高效运行和稳定性。

在选择连接池实现时,建议根据你的应用场景和性能需求选择合适的连接池。HikariCP以其高性能和低延迟著称,适合大多数高并发场景;Druid提供了强大的监控和统计功能,适合对数据库性能有较高要求的场景;C3P0和DBCP则适合小型项目或对性能要求不高的场景。

乘风破浪会有时,直挂云帆济沧海!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Continue 插件时,发现调用外部地址

https://us.i.posthog.com/e/?ip1&_1737025525924&ver1.163.0&compressiongzip-js 看是一个帮助改善产品的网址。估计类似某推广流量监控的插件工具吧。网上没用查到其他说明,可能国内使用不多的原因。 但是发送的数据看不出来是个什么内容。 我用来搜…

【PyQt】图像处理系统

[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图: 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何La…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具,尤其是做java开发的,那么做java开发,了解spring框架源码是提高自己技能水平的一个方式,所以会从spring 官网下载源码,导入到 Idea 工具并编译,但是发现build的时…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

爬虫后的数据处理与使用(使用篇--实现分类预测)

()紧接上文,在完成基本的数据处理后,接下来就是正常的使用了。当然怎么用,确实需要好好思考一下~ 上文:爬虫后的数据处理与使用(处理篇) 前言: 一般来说,我…

RabbitMQ--延迟队列

(一)延迟队列 1.概念 延迟队列是一种特殊的队列,消息被发送后,消费者并不会立刻拿到消息,而是等待一段时间后,消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多,…

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈 开发背景 可能大家听过过蓝湖可以转ui设计图为vue.js,react native代码,那么请问听说过将figma的设计图转换为flutter源代码吗?本文优雅草央千澈带…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题:当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线; 原因:el-table有一个before的伪元素作为表格的下边框下,初始的时候已设置,在滚动的时候并没有重新设置…

代理模式实现

一、概念:代理模式属于结构型设计模式。客户端不能直接访问一个对象,可以通过代理的第三者来间接访问该对象,代理对象控制着对于原对象的访问,并允许在客户端访问对象的前后进行一些扩展和处理;这种设置模式称为代理模…

windows 搭建flutter环境,开发windows程序

环境安装配置: 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后,随便找个地方解压,然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了&#xff0…

Redis系列之底层数据结构字典Dict

Redis系列之底层数据结构字典Dict Dict数据结构 Dict是Redis数据结构中使用最为频繁的复合型数据结构,本质上是一个哈希表 查看redis6.0版本的源码,链接:https://github.com/redis/redis/blob/6.0/src/dict.h 哈希表的结构定义&#xff1…

【Azure 架构师学习笔记】- Azure Function (2) --实操1

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Function 】系列。 接上文【Azure 架构师学习笔记】- Azure Function (1) --环境搭建和背景介绍 前言 上一文介绍了环境搭建,接下来就在本地环境下使用一下。 环境准备 这里我下载了最新的VS studio&…

【NextJS】PostgreSQL 遇上 Prisma ORM

NextJS 数据库 之 遇上Prisma ORM 前言一、环境要求二、概念介绍1、Prisma Schema Language(PSL) 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系&…

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法:遍历str字符串,将字符串中的每个字符作为对称点,向两边扩散找到回文字段&#x…

浅谈操作系统与初识Linux

一、Linux操作系统的出现 1.1操作系统的出现以及相关的四个要素 1.2最早出现的操作系统及其创始人 起初,IBM为了让计算机可以以更低技术成本进行使用,以此来售卖计算机; 为计算机搭载上了Unix操作系统,Unix由肯汤普森用汇编语…

ElasticSearch下

DSL查询 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理: 排序:按照1个或多个字段做排序分页…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题,需要处理将ftl文件中的图片的Base64删除,并使用占位符代替插入表格,并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

链式前向星的写法

【图论02】动画说图的三种保存方式 降低理解门槛 邻接表 链式前向星 邻接矩阵_哔哩哔哩_bilibili 杭电ACM刘老师-算法入门培训-第12讲-拓扑排序及链式前向星_哔哩哔哩_bilibili 图论003链式前向星_哔哩哔哩_bilibili(链式前向星的遍历) head数组的下标…

想品客老师的第一天:值类型使用

前面两章的摘要 ECMAscript(也就是ES)是JavaScript的一个标准,就像c的c11和c99一样,几把的一年出一套标准 freeze()是一个对象方法,表示锁定、固定一个对象不可改变(因为const对于标量不可变,…

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…