首页 > 数据库 >Mysql--实战篇--连接池(连接池原理,HikariCP、C3P0、Druid和DBCP等)

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

时间:2025-01-18 22:28:05浏览次数:3  
标签:实战篇 空闲 -- spring 连接数 datasource 连接 连接池

连接池(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.HikariDataSource
    hikari:
      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.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat,wall,log4j
      connection-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则适合小型项目或对性能要求不高的场景。

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

标签:实战篇,空闲,--,spring,连接数,datasource,连接,连接池
From: https://blog.csdn.net/qq_34207422/article/details/145233827

相关文章

  • 基于Springboot医疗挂号管理系统【附源码+文档】
    ......
  • 4-08动态绑定_多态
    多继承无函数覆盖structBase1 { public: virtualvoidFn_1() { printf("Base1:Fn_1...\n"); } virtualvoidFn_2() { printf("Base1:Fn_2...\n"); } }; structB......
  • 独立自主
    (一九三七年十一月十五日)周并告朱、彭、任:甲周元亥电悉。乙目前山西工作原则是“在统一战线中进一步执行独立自主”,因为国民党及阎、黄、卫在日寇一击之下,已基本上丧失在山西继续支持的精神与能力,我们须自己作主,减少对于他们的希望与依靠,故“独立自主”之实行,须比较......
  • 973.最接近原点的K个点
    973.最接近原点的K个点varkClosest=function(points,k){letn=points.length;if(k>n){returnpoints;}letdists=newArray(n).fill(null);for(leti=0;i<n;++i){dists[i]=dist(points[i])}dists.sort((a,b)=>......
  • P3518 [POI2011] SEJ-Strongbox
    P3518[POI2011]SEJ-StrongboxDescription有一个密码箱,\(0\)到\(n-1\)中的某些整数是它的密码。且满足:若\(a\)和\(b\)是它的密码,则\((a+b)\bmodn\)也是它的密码(\(a\),\(b\)可以相等)。某人试了\(k\)次密码,前\(k-1\)次都失败了,最后一次成功了。问,该密码箱最多有多......
  • java零基础入门(一)
    Java零基础入门(一)一Java版本Java共分为三个版本JavaSE标准版最为基础的版本适合桌面程序、控制台开发等等JavaME嵌入式开发适合小家电等目前基本上已不再使用JavaEE企业级开发适用于web端、服务器开发等二Java安装环境介绍以下三个概念为下层包含上层的关系......
  • mkv转码mp4(ffmpeg工具)
    mkv转码mp4(ffmpeg工具)基于windows,Linux也可以用,都是命令行下载路径(https://github.com/BtbN/FFmpeg-Builds/releases)下载安装包:ffmpeg-n6.1-latest-win64-lgpl-6.1.zip,(根据自己的平台选择下载)并解压到对应目录,拷贝解压后的目录,添加到环境变量新增配置:D:\ffmpeg-n6.1-latest......
  • java零基础入门(二)
    Java零基础入门(二)基础语法一注释注释不会被运行,帮我们阅读代码,要养成写注释的习惯单行注释用//开头即可多行注释用/*开头*/结束,将需要写的内容夹在中间文档注释用/**开头*/结尾,里边特殊名词可以被识别二标识符与关键字在Java中所有的组成部分都需要名字。其中......
  • 2025.1.17 近期练习
    CF1286DLCC这个题还是比较简单的,考虑拆贡献,将所有碰撞情况拿出来考虑其出现的概率,显然只有相邻的。按照时间排序。假设我们钦定了\((i,i+1)\)这对碰撞为最先碰撞的,那么需要满足若干条件:例如若\(j\)向右,\(j+1\)不能向左等,因为限制只存在于相邻两位,我们可以考虑dp过去。......
  • 哲学家评画
      《读书》2023年第10期《福柯的绘画考古学》  萨特——丁托莱托;  梅洛-庞蒂——塞尚;  列维-斯特劳斯——普桑;  拉康——小汉斯·霍尔拜因;  德勒兹——培根;  德里达——拉斐尔、凡高;  米歇尔·亨利——康定斯基;  马利翁......