数据库连接池汇总

原创
05/16 06:27
阅读数 11

1数据库连接池

1.1基本介绍

        数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

1.2传统JDBC的缺点

(1)用户每次请求都需要向数据库获得连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。

(2)假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。

1.3原理介绍

        在服务器端一次性创建多个连接,将多个连接保存在一个连接池对象中,当应用程序的请求需要操作数据库时,不会为请求创建新的连接,而是直接从连接池中获得一个连接,操作数据库结束之后,并不需要真正关闭连接,而是将连接放回到连接池中。

​​​​​​​1.4连接池选型

1.4.1考虑因素

(1)当前连接DB的规模

(2)并发情况

(3)执行DB的响应时间

​​​​​​​1.4.2配置考虑

  • 初始化连接:可考虑设置为3个连接 ,对于DB规模特别大的情况下可考虑设置为1个,避免启动时间过长。
  • 最小连接:可考虑该值的设置和初始化连接保持一致。
  • 最大连接:对于有较大DB规模,最大连接不要设置过大,避免本地维护的DB太大。 如果对应到数据源的并发数过高,可考虑增大最大连接数。
  • 获取连接的超时时间:如果连接全部被占用,需要等待的时间。可以根据当前系统的响应时间判定,如果容忍度较高,可以大点。容忍度较低,设置小点。
  • 当获取连接和释放连接心跳检测:建议全部关闭,否则每个数据库访问指令会对数据库生产额外的两条心跳检测的指令,增加数据库的负载,连接有效性的检查改用后台空闲连接检查。
  • 连接有效性检测时间:该值需要结合数据库的wait_timeout,interactive_timeout值进行设置,假如数据库为120s,则心跳检测时间在120s以内越大越好。如果太小,心跳检测时间会比较频繁,建议设置为90s。
  • 最大空闲时间:如果连接超过该时间没有使用过,则会进行close掉。 该值不要太小,避免频繁的建立连接关闭连接。也不要太大,导致一直无法关闭。
  • 心跳检查的sql语句:尽量使用ping命令,ping的性能较查询语句高。大部分的数据库连接池不配置query语句,便会调用ping命令。
  • prepareStatement缓存:可以根据自己的业务来判定是否开启。开启后对性能的影响依赖于具体业务和并发情况,可考虑暂时不开启。
  • 连接使用超时:业务拿到一个连接,如果超过指定的时间未归还,是否把该连接给回收掉,超时时间等和具体的业务关联,暂时建议先不开启。

1.4.3常用连接池

1.4.3.1 C3P0

       实现数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。Hibernate、Spring使用。单线程,性能较差,适用于小型系统,代码600KB左右。

​​​​​​​1.4.3.2 DBCP(Apache出品

       Apache的, Jakarta commons-pool对象池机制,Tomcat使用。单独使用dbcp需要3个包:common-dbcp.jar、common-pool.jar、common-collections.jar,预先将数据库连接放内存中,建立数据库连接时,直接到连接池中申请,用完放回。单线程,并发量低,性能不好,适用于小型系统。

​​​​​​​1.4.3.3 Druid(阿里巴巴出品)

       Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。

业界把 Druid 和 HikariCP 做对比后,虽说 HikariCP 的性能比 Druid 高,但是因为 Druid 包括很多维度的统计和分析功能,所以这也是大家都选择使用它的原因。

​​​​​​​1.4.3.4 HikariCP

      号称Java平台最快的连接池,是一个十分快速、简单、可靠及十分轻量级的连接池,只有130KB目前被SpringBoot官方推荐使用的数据库连接池。

​​​​​​​1.4.4 连接池对比

  • 性能方面:HikariCP>Druid>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
  • c3p0历史悠久,代码逻辑极其复杂,不利于维护,综合考虑推荐使用druid或hikariCP连接池。
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部