java 数据库连接池总结

时间:2025-08-26 17:00:02来源:互联网

下面小编就为大家分享一篇java 数据库连接池总结,具有很好的参考价值,希望对大家有所帮助。

概念

数据库连接池负责分配、管理和释放数据库连接

在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,从连接池中取出一个已建立的空闲连接对象。使用完毕后,将连接放回连接池中,以供下一个请求访问使用。

连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。

也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

 

优点

使用数据库连接池1、可以避免频繁的创建销毁连接带来的时间和性能消耗2、可以更方便的管理数据库连接的上下限,空闲时间等

未使用数据库连接池的交互过程

1. TCP 建立连接 三次握手 2. MySql 认证的 三次握手 3. SQL 的执行 4. MySql 的关闭 5. TCP 的 四次握手 关闭 

缺点:频繁的进行tcp连接创建关闭、mysql认证,会消耗系统性能和增加响应时间

使用数据库连接池的交互过程

可以建立一次连接,进行多次的sql执行,只有在连接创建时进行tcp连接建立与mysql认证,关闭连接时进行mysql关闭和tcp关闭

优点:节省系统资源,响应更加快速

java与数据库交互过程

在 Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁, 即Java语言通过JDBC技术访问数据库。

分为几步:

  1. 装载数据库驱动程序;
  2. 通过jdbc建立数据库连接;
  3. 访问数据库,执行sql语句;
  4. 断开数据库连接。

jdbc说明

JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序(Driver),如oracle驱动程序,sqlserver驱动程序,mysql驱动程序

数据库连接池与jdbc关系

连接池使用JDBC API 接口来跟数据库打交道,JDBC为第三方应用服务器(Application Server)提供了一个由数据库厂家实现的管理标准接口:连接缓冲(connection pooling)。引入了连接池( Connection Pool )的概念 ,也就是以缓冲池的机制管理数据库的资源。

配置参数

 连接超时时间:获取连接的等待时长(连接超时时间)(等待连接池分配连接的最大时长)(最佳实践:非特殊业务场景保持30s连接超时即可。)

数据库连接测试语句作用

数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP,当旧的 IP 下的数据库服务关闭后,再使用这个连接查询就会发生错误;
启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。来减少对业务的影响

连接数量的设置

初期可以依据经验来设置,后面还是需要根据实际运行情况做调整。

 

数据库连接池与mysql连接数关系

数据库连接池是对配置该连接池的应用所能用的sql连接做配置,mysql有自己的最大可用连接数,mysql数据库的已用连接数是所有配置该数据库的应用正在使用的连接数之和。

连接超时 

1、应用设置的连接池总连接数太少,导致连接等待时间过长

2、数据库设置的连接数太少,导致连接等待时间过长

3、应用设置的连接超时时间太短

4、数据库设置的wait_timeout太短

mysql的超时时间

show global variables like '%timeout%';

connect_timeout

tcp连接超时是时间(默认10秒),是连接过程中握手的超时时间,是客户端与mysql服务器建立连接时,握手开始到结束的超时时间。

interactive_timeout/wait_timeout

交互/非交互模式下的不活跃线程的等待时间,默认8小时,连接超过这个时间长度没有过操作,mysql会断开该连接

 

数据库连接池原理

第一步,连接池的创建。一般系统初始化时,连接池会根据系统配置创建,并在池中创建了最小连接数的连接

第二步,连接池的管理。当客户请求数据库连接时,首先查看连接池中是否有空闲的连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大的连接数,如果没有达到就重新创建一个连接给请求的客户;如果达到就按设定的最大时间进行等待,如果超出最大等待时间,则抛出连接数据库失败。

当请求结束后,连接处于空闲状态,到达空闲时间限制时,判断连接池中连接数量是否多于最小连接数,是的话关闭该连接,否则继续保留该连接

第三步,连接池的关闭 。当应用程序退出时,关闭连接池中的所有连接,释放连接池相关的资源

数据库驱动

 

常用数据库连接池

(一代连接池)C3P0、DBCP、(二代连接池)Druid、HikariCP,一二代产品区分最重要的特征是架构和设计时采用的线程模型。

一般来讲采用单线程同步的架构设计都属于第一代连接池,采用多线程异步架构的则属于第二代。比较有代表性的就是Apache Commons DBCP,在1.x版本中,一直延续着单线程设计模式,到2.x才采用多线程模型。

C3P0已经很久没有更新了。DBCP更新速度很慢,基本处于不活跃状态,而Druid和HikariCP处于活跃状态的更新中,这就是我们说的二代产品了。

数据库连接池的选择

相较于其他连接池而言的,对整个系统应用来说,第二代连接池在使用过程中体会到的差别是微乎其微的,基本上不存在因为连接池的自身的技术导致系统性能下降的情况

HikariCP

它现在是spring boot的默认连接池

参数说明

hikari: # 时间单位均为ms
    minimum-idle: 5 # 最小连接数,建议不设置,但如使用idle-timeout,该值需要小于maximum-pool-size
    maximum-pool-size: 10 # 最大连接数,hikari做过测试根据CPU计算最优最大连接池,如下 # connections = ((cpu_core_count * 2) + effective_spindle_count) # 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数 
    auto-commit: true # 默认 
    idle-timeout: 300000 # 连接空闲时间该值建议小于max-lifetime ,最小连接数外的连接达到了空闲时间限制会被关闭
    max-lifetime: 600000 # 该值建议小于数据库的连接关闭等待时间 wait_timeout
    connection-timeout: 30000 # 默认30s,连接超时会报异常 # Connection is not avaitabte, request timed out after 59089ms 
    validation-timeout: 5000 # 支持JDBC4的是isValid超时时间,不支持的是testQuery超时时间 
    connection-test-query: 'SELECT 1' # 支持JDBC4的不建议使用,因为JDBC4的isValid方法效率更高

maximum-pool-size   池中最大连接数(包括空闲和正在使用的连接)
minimum-idle   池中最小空闲连接数量。默认值10
pool-name   连接池的名字
auto-commit   是否自动提交池中返回的连接。默认值为true。
idle-timeout    空闲时间(毫秒)。仅在minimum-idle小于maximum-poop-size的时候才会起作用。默认值10分钟。最小生效值:10000ms
max-lifetime   连接池中连接的最大生命周期(毫秒)。默认:30分钟 1800000ms,最小可配置:30000,即30s
connection-timeout   连接超时时间(毫秒)。默认值为30s,可以接收的最小超时时间为250ms。

 

idle-timeout 连接池会定时轮询检测哪些连接是空闲,并且空闲达到了idleTimeout配置的时间,但轮询间隔有时间差,一个空闲连接最大可空闲idleTimeout + 30s会逐出,平均是:idleTimeout + 15s。

max-lifetime该属性用于控制连接在池中的最大生存时间,超过该时间强制逐出,连接池向数据库申请新的连接进行补充。注意:当前正在使用的连接不会强制逐出,哪怕它的累计时间已经到了maxLifetime。当连接一致处于闲置状态时,数据库可能会主动断开连接。,建议设置比数据库超时时长小一些,参考MySQL wait_timeout参数(show variables like '%timeout%';)

connectionTestQuery驱动支持JDBC4不需要设置,反之需要配置,MYSQL: select 1,因为该属性的设置是为了支持keepalive检测,只有当JDBC4的isValid不可用时才使用connectionTestQuery配置的sql进行检测;或者当从池中获取连接时检测连接是否有效,缺省:none

minimum-idle,为了性能最优化和为了应对高峰请求的快速响应强烈不建议设置该属性,让HikariCP连接池保持固定大小。跟maximumPoolSize设置成相同

maximum-pool-Size根据实际环境配置,通常设置为核心数的2倍较优

报错分析

mysql Connection is not available,request timed out after ****ms

 

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!