一、前言

开发web项目,我们肯定会和数据库打交道,因此就会涉及到数据库链接的问题。在以前我们开发传统的SSM结构的项目时进行数据库链接都是通过JDBC进行数据链接,我们每和数据库打一次交道都需要先获取一次链接,操作完后再关闭链接,这样子效率很低,因此就出现了连接池,用于高效创建并合理分配数据库链接,数据库连接池跟线程池其实也一样的道理。

说到连接池就不得不说到持久层的框架JDBC、MyBatis、Hibernate、Spring Data等,目前市面上最流行的应该属于MyBatis(底层JDBC),其中还有个MyBatis-plus并不属于新的框架,只能算是在MyBatis上包装了一层更便于开发人员使用而已。从上图可以看出来,其实现在市面上演变而来的持久层框架大多都是基于JDBC而来的,下面我们就讲一讲连接池相关的内容吧。

二、连接池介绍

1.使用连接池的好处

①资源重用

避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

②更快的系统响应速度

在初始化过程中,就已经创建好若干数据库连接。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

③新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。

④ 统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

2.常见连接池

现在市面上的连接池有很多种,此处我也只列举几种使用较多的:

①C3P0

开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。

②DBCP

全称(Database Connection Pool),由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。

③Tomcat Jdbc Pool

Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超级简单核心文件只有8个,支持JMX,支持XA Connection。

④BoneCP

官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP的速度是最快的,要比当时第二快速的连接池快25倍左右,完美集成到一些持久化产品如Hibernate和DataNucleus中。BoneCP特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织,100%单元测试分支代码覆盖率;代码40KB左右。

⑤Druid(德鲁伊)–推荐使用

Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。

⑥Hikari

HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池,是一个高性能的JDBC连接池,基于BoneCP做了不少的改进和优化。并且在springboot2.0之后,采用的默认数据库连接池就是Hikari。

3.各种连接池的优缺点

4.项目中该如何选择连接池

小型项目
若只是小型SpringBoot项目,那么你无论使用Druid和Hikari哪种都可以,都有各自的优缺点。使用SpringBoot自带的Hikari数据库连接池操作简单,不需要引入额外的jar包,拿来即用,也不需要额外的多做配置等,使用Druid连接池还支持sql级监控、扩展、SQL防注入等。–推荐使用Druid连接池

中型项目
推荐使用Druid数据库,也就是我们平时说的德鲁伊连接池,使用理由如下:

  • Druid功能更全面,除具备连接池基本功能外,还支持sql级监控、扩展、SQL防注入等。最新版甚至有集群监控
  • 单从性能角度考虑,从数据上确实HikariCP要强,但Druid有更多、更久的生产实践,它可靠。

大型项目
推荐使用默认的HikariCP连接池,因为大型项目中有专门用于监控的系统(skywalking、prometheus),连接池就只需要它做好连接池的本职工作即可,因此性能更好的HikariCP才是首选。

三、SpringBoot中的连接池及使用

1.SpringBoot默认连接池(Hikari)使用

配置文件中的数据源配置中不设置数据源类型即使用默认的Hikari,如果需要设置连接池配置参数直接在配置文件中设置即可:

#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/gsnm_base_0000?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456# 数据库连接池配置
#最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=10
#最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=20
#空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒
spring.datasource.hikari.idle-timeout=500000
#连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=540000
#连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000

Hikari连接池的使用是很简单的,因为是默认的连接池,因此我们也不需要做过多的配置,拿来既可以使用。

2.SpringBoot整合druid(德鲁伊)连接池

①导入druid-spring-boot-starter包(推荐1.2.21版本)

注意:此包1.1.10后的版本数据监控中心做了调整需要自己新增配置类

<!--引入druid数据源 1.1.10 此版本的数据监控中心可以直接使用--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency>
 <!--druid数据源 1.1.21 此版本的数据监控中心增加了登录界面需要增加配置类--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version></dependency>

②修改配置文件

#数据库连接中修改数据源类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource# druid参数调优(可选),若配置如下参数则必须手动添加配置类
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
# 测试连接
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
# 配置监控统计拦截的filters
# asyncInit是1.1.4中新增加的配置,如果有initialSize数量较多时,打开会加快应用启动时间
spring.datasource.asyncInit=true
# druid监控配置信息
spring.datasource.filters=stat,config
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

③新增数据源配置类DruidConfig

若没有指定连接池参数,则无需此配置类

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import java.sql.SQLException;/*** Druid连接池调优配置信息:只有配置数据库连接池调优信息才需要该类*** @author wyj* @date 2022/8/16 15:54*/
@Configuration
public class DruidConfig {private Logger logger = LoggerFactory.getLogger(DruidConfig.class);@Value("${spring.datasource.url}")private String dbUrl;@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driver-class-name}")private String driverClassName;@Value("${spring.datasource.initial-size}")private int initialSize;@Value("${spring.datasource.min-idle}")private int minIdle;@Value("${spring.datasource.max-active}")private int maxActive;@Value("${spring.datasource.max-wait}")private int maxWait;@Value("${spring.datasource.time-between-eviction-runs-millis}")private int timeBetweenEvictionRunsMillis;@Value("${spring.datasource.min-evictable-idle-time-millis}")private int minEvictableIdleTimeMillis;@Value("${spring.datasource.test-while-idle}")private boolean testWhileIdle;@Value("${spring.datasource.test-on-borrow}")private boolean testOnBorrow;@Value("${spring.datasource.test-on-return}")private boolean testOnReturn;@Value("${spring.datasource.pool-prepared-statements}")private boolean poolPreparedStatements;@Value("${spring.datasource.max-pool-prepared-statement-per-connection-size}")private int maxPoolPreparedStatementPerConnectionSize;@Value("${spring.datasource.filters}")private String filters;@Primary  //在同样的DataSource中,首先使用被标注的DataSource@Beanpublic DruidDataSource dataSourceDefault(){DruidDataSource datasource = new DruidDataSource();datasource.setUrl(this.dbUrl);datasource.setUsername(username);datasource.setPassword(password);datasource.setDriverClassName(driverClassName);//configurationdatasource.setInitialSize(initialSize);datasource.setMinIdle(minIdle);datasource.setMaxActive(maxActive);datasource.setMaxWait(maxWait);datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);datasource.setTestWhileIdle(testWhileIdle);datasource.setTestOnBorrow(testOnBorrow);datasource.setTestOnReturn(testOnReturn);datasource.setPoolPreparedStatements(poolPreparedStatements);datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);try {datasource.setFilters(filters);} catch (SQLException e) {logger.error("druid configuration initialization filter", e);}return datasource;}
}

④新增数据监控中心配置类DruidMonitorConfig

若jar包版本高于1.1.10时才需要配置该类

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;/*** Druid连接池监控配置信息* 提示:druid-spring-boot-starter jar包的版本高于1.1.10时才需要配置该类* 1.若低于1.1.10版本时直接访问:IP:端口/druid/index.html即可* 2.若高于1.0.10版本时访问:IP:端口/druid/login.html即可 账号密码根据自己设置的来** @author wyj* @date 2022/8/16 15:54*/
@Configuration
public class DruidMonitorConfig {//因为Springboot内置了servlet容器,所以没有web.xml,替代方法就是将ServletRegistrationBean注册进去//加入后台监控@Bean  //这里其实就相当于servlet的web.xmlpublic ServletRegistrationBean<StatViewServlet> statViewServlet() {ServletRegistrationBean<StatViewServlet> bean =new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");//后台需要有人登录,进行配置//bean.addUrlMappings(); 这个可以添加映射,我们在构造里已经写了//设置一些初始化参数Map<String, String> initParas = new HashMap<>();initParas.put("loginUsername", "admin");//它这个账户密码是固定的initParas.put("loginPassword", "123456");//允许谁能防伪initParas.put("allow", "");//这个值为空或没有就允许所有人访问,ip白名单//initParas.put("allow","localhost");//只允许本机访问,多个ip用逗号,隔开//initParas.put("deny","");//ip黑名单,拒绝谁访问 deny和allow同时存在优先denyinitParas.put("resetEnable", "false");//禁用HTML页面的Reset按钮bean.setInitParameters(initParas);return bean;}//再配置一个过滤器,Servlet按上面的方式注册Filter也只能这样@Beanpublic FilterRegistrationBean<WebStatFilter> webStatFilter() {FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>();//可以设置也可以获取,设置一个阿里巴巴的过滤器bean.setFilter(new WebStatFilter());bean.addUrlPatterns("/*");//可以过滤和排除哪些东西Map<String, String> initParams = new HashMap<>();//把不需要监控的过滤掉,这些不进行统计initParams.put("exclusions", "*.js,*.css,/druid/*");bean.setInitParameters(initParams);return bean;}
}

数据监控中心访问地址:
1.若jar包版本低于1.1.10版本时访问:127.0.0.1:端口/druid/index.html
2.若jar包版本高于1.0.10版本时访问:127.0.0.1:端口/druid/login.html(账号密码根据自己设置的来)

SpringBoot的数据库连接池相关推荐

  1. springboot+dbcp数据库连接池

    springboot+dbcp数据库连接池 1,连接池配置文件 2,连接工具类 3,测试类测试连接 4,实际调用连接去同步数据 1,连接池配置文件 在resources目录下添加文件dbcp.prop ...

  2. SpringBoot 默认数据库连接池 HikariCP

    目录 引言 1.问题描述 2.SpringBoot默认的数据库连接池 3.HikariCP是什么 4.测试依赖 5.配置文件 5.1.数据库连接参数 5.2.连接池数据基本参数 5.3.连接检查参数 ...

  3. SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)

    作者:大三的土狗 专栏:SpringBoot入门到精通 快速导航 前言 1.连接池介绍 2.HicariCP 1)导入坐标 2)修改配置 3)优势 3.Druid 1)导入坐标 2)修改配置 3)优势 ...

  4. springboot配置数据库连接池hikari

    Springboot2.0以后默认数据库连接池选择了Hikari(性能高)开源地址:https://github.com/brettwooldridge/HikariCP 里面有技术文档 性能方面 h ...

  5. springboot 查看数据库连接池

    在 src/test 下查看 我查看的是 springboot的默认连接池 @SpringBootTest class SpringbootMybatisApplicationTests {//spr ...

  6. SpringBoot默认数据库连接池Hikari

    Hikari是一款非常强大,高效,并且号称"史上最快连接池".由于其性能方面比较好,并且在springboot2.0之后,采用的默认数据库连接池就是Hikari,在引用parent ...

  7. SpringBoot2数据库连接池自动装配原理,以及如何配置使用其他的数据库连接池(druid)为例

    SpringBoot2数据库连接池自动装配原理 一.SpringBoot的数据库连接池的相关默认 二.SpringBoot默认的数据库连接池,以及自动装配原理 三.使用其他的数据库连接池:例如Drui ...

  8. 跟我学Springboot开发后端管理系统4:数据库连接池Druid和HikariCP

    上一篇文章主要讲解了如何再Matrix-Web中使用Mybatis-Plus,Mybatis-Plus作为Orm框架,连接数据库需要连接数据库的依赖.WEB 系统高并发环境下,频繁的进行数据库连接操作 ...

  9. windows10风格 springboot activiti 整合项目框架源码 shiro 安全框架 druid 数据库连接池...

    QQ 313596790 官网: www.fhadmin.org 下载地址 此项目为Springboot工作流版本 windows 风格,浏览器访问操作使用,非桌面应用程序. 1.代码生成器: [正反 ...

最新文章

  1. 算法学习:常用排序方法
  2. 架构漫谈:我心中的架构
  3. 混合模型的推荐算法(ACM暑校-案例学习)
  4. VTK:IO之3DSImporter
  5. 三星Galaxy S21开启预购:最早1月14日发布 售价约5300元起
  6. html两个div有缝隙_HTML第一课
  7. 牛客小白月赛13 解题报告
  8. python入门教程pdf-python基础教程第4版pdf
  9. iText 中写Word RTF 文档 中文字体设置
  10. oracle 退出循环 使变量清空,[转]Oracle 清除incident和trace -- ADRCI用法
  11. python一行代码制作20款经典游戏
  12. 工业机器人cloos_工业机器人的技术发展及其应用
  13. Spring Boot 支持 HTTPS 如此简单,So easy!
  14. java读取war3模型_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...
  15. CHI论文阅读(1)EmoGlass: an End-to-End AI-Enabled Wearable Platform for Enhancing Self-Awareness of Emoti
  16. 24点计算器c语言源代码,萌新求助!!24点游戏计算器
  17. 极客时间大数据训练营知识总结脑图
  18. 8.custom-links
  19. matlab拉普拉斯锐化程序,laplace(拉普拉斯)锐化matlab程序
  20. loadrunner server压力测试 sql_LoadRunner进行负载压力测试

热门文章

  1. LabVIEW UI设计的几个技巧
  2. SQL Server常见问题介绍及快速解决建议
  3. 三星c7pro android版本,都来了:三星Galaxy C5/C7 Pro升级安卓7.0
  4. php medoo 创建表,PHP数据库框架Medoo1.6安装教程
  5. 自助互阅php,2019微信互阅群,刷注册量平台
  6. 国企事业单位校招单位简介
  7. 硬盘数据恢复的神器有哪些?
  8. Amaze UI 入门引导
  9. 2021-2027全球与中国变容二极管市场现状及未来发展趋势
  10. Uncaught SyntaxError: Invalid shorthand property initialize