SpringBoot之集成Druid数据库连接池方式

 更新时间:2026年06月04日 09:27:43   作者:飞哥|Java 教学专家  
这篇文章主要介绍了SpringBoot之集成Druid数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

在软件系统中都会使用到数据库,是开发中大型系统不可缺少的。但如果对数据库资源没有很好地管理,往往会直接导致系统的稳定。随着系统流量、用户的增加,会逐步显露。

使用数据库连接池可以更好、更高效的管理数据库连接资源,我们可以直接使用第三方服务,不必自己思索数据库连接的管理。

数据库连接池技术有:DBCP 、tomcat-jdbc、C3P0、HikariCP、Druid 等。

优先推荐 Druid。它作为国货,更加符合国人的思维,功能丰富,还经历了千锤百炼。

一、数据库连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

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

数据库连接池优点:

  • 资源重用
  • 更快的系统响应速度
  • 高效资源分配手段
  • 统一的连接管理,避免数据库连接泄漏

二、SpringBoot数据库连接池

SpringBoot 2.2.6 文档说明:

  1. 由于 HikariCP 的性能和并发性。如果有 HikariCP,SpringBoot 会选择它。
  2. 否则,如果 Tomcat数据源连接池 可用,也可以使用它。
  3. 如果 HikariCPTomcat数据源连接池 都不可用,并且如果 Commons DBCP2 可用,就使用它。

可以使用 spring.datasource.type 属性来指定要使用的连接池。

如果使用 spring-boot-starter-jdbcspring-boot-starter-data-jpa,将自动获得对 HikariCP 的依赖。

三、Druid数据库连接池

Druid 连接池是阿里巴巴开源的数据库连接池项目(阿里巴巴数据库事业部出品)。Druid 连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防 SQL注入,内置 Loging 能诊断 Hack 应用行为。

Druid 是一个 JDBC 组件库,包含数据库连接池、SQL Parser 等组件, 被大量业务和技术产品使用或集成,经历过最严苛线上业务场景考验。是 Java 语言中最好的数据库连接池。

官方提供对比:Druid 连接池在性能、监控、诊断、安全、扩展性这些方面远远超出竞品。

功能类别功能DruidHikariCPDBCPTomcat-jdbcC3P0
性能PSCache
LRU
SLB负载均衡支持
稳定性ExceptionSorter
扩展扩展FilterJdbcIntercepter
监控监控方式jmx/log/httpjmx/metricsjmxjmxjmx
支持SQL级监控
Spring/Web关联监控
诊断支持LogFilter
连接泄露诊断logAbandoned
安全SQL防注入
支持配置加密

四、SpringBoot集成Druid

1.环境说明

  • 开发工具:IDEA 2019.3.1
  • 框架版本:SpringBoot 2.2.6
  • 数据库:MySql 8.0.19
  • 数据库连接池:Druid 1.1.9

2.集成步骤

(1)添加maven依赖

<!-- Druid 数据库连接池 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.9</version>
</dependency>

(2)Druid配置

application.properties文件

# ======================================== Druid 配置 ========================================= #
# 要使用的连接池实现的全限定名。默认情况下,它是从类路径自动检测到的。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# JDBC配置:
# JDBC驱动程序的完全限定名。默认情况下基于URL自动检测
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库的JDBC URL
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
# 数据库登录用户名
spring.datasource.druid.username=root
# 数据库登录密码
spring.datasource.druid.password=root
# 连接池配置:
# 初始化时建立物理连接的个数
spring.datasource.druid.initial-size=2
# 最大连接池数量
spring.datasource.druid.max-active=10
# 最小连接池数量
spring.datasource.druid.min-idle=2
# 属性类型是字符串,通过别名的方式配置扩展插件,配置多个英文逗号分隔。
# 常用的插件有:监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall
spring.datasource.druid.filters=stat,wall
# 监控配置:
# WebStatFilter配置
# 是否启用StatFilter默认值false
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除不必要的url
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.jpg,*.css,*.ico,/druid/*
# 是否开启session统计功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true
# session最大数,缺省sessionStatMaxCount是1000个
spring.datasource.druid.web-stat-filter.session-stat-max-count=500
# 用户user信息保存在session中的sessionName,druid能够知道当前的session用户
spring.datasource.druid.web-stat-filter.principal-session-name=web_user
# 用户user信息保存在cookie 中的cookieName,druid能够知道当前的用户
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
# 监控单个url调用的sql列表
spring.datasource.druid.web-stat-filter.profile-enable=true
# StatViewServlet配置
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=true
# 访问url模式
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允许清空统计数据
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 监控页面访问用户名
spring.datasource.druid.stat-view-servlet.login-username=admin
# 监控页面访问密码
spring.datasource.druid.stat-view-servlet.login-password=admin
# -访问控制:
#   -deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。
#   -如果allow没有配置或者为空,则允许所有访问)
#   -由于匹配规则不支持IPV6,配置了allow或者deny之后,会导致IPV6无法访问
# 访问控制,白名单IP
#spring.datasource.druid.stat-view-servlet.allow=
# 访问控制,黑名单IP
#spring.datasource.druid.stat-view-servlet.deny=
# Spring监控配置
# Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
#spring.datasource.druid.aop-patterns=
# ======================================== Druid 配置 结束 ========================================= #

DruidDataSource 配置属性列表

DruidDataSource 配置兼容 DBCP,但个别配置的语意有所区别。

配置缺省值说明
name配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。
url连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username连接数据库的用户名
password连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive8最大连接池数量
minIdle最小连接池数量
maxWait获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxPoolPreparedStatementPerConnectionSize-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validationQueryTimeout单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
keepAlivefalse(1.0.28)连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
minEvictableIdleTimeMillis连接保持空闲而不被驱逐的最小时间
connectionInitSqls物理连接初始化的时候执行的sql
exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
filters属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

(3)监控页面

Druid 内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息。

这个 StatViewServlet 的用途包括:

  • 提供监控信息展示的 html 页面
  • 提供监控信息的 JSON API

输入 http://127.0.0.1:8080/demo/druid 进入 Druid 监控登录页面,输入配置中的用户名和密码。

进入到 Druid 监控页面,可以看到非常全面的系统监控数据。

总结

目前只是 SpringBoot 集成了 Druid 连接池,并可以进入监控页面进行查看相关监控数据。后期可以将监控页面嵌入到系统中,或是直接获取监控数据自行展示。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java基本教程之Thread中start()和run()的区别 java多线程教程

    java基本教程之Thread中start()和run()的区别 java多线程教程

    这篇文章主要介绍了Thread中start()和run()的区别,Thread类包含start()和run()方法,它们的区别是什么?下面将对此作出解答
    2014-01-01
  • IDEA集成DeepSeek的详细教程(保姆级教程)

    IDEA集成DeepSeek的详细教程(保姆级教程)

    DeepSeek作为一款强大的代码搜索和分析工具,能够帮助开发者快速定位代码、理解项目结构以及优化代码质量,本文将详细介绍如何在IntelliJ IDEA中集成DeepSeek,并展示如何利用它来提升开发效率,感兴趣的朋友一起看看吧
    2025-02-02
  • SpringMVC 如何使用thymeleaf 进行数据展示

    SpringMVC 如何使用thymeleaf 进行数据展示

    thymeleaf是前端的视图解析器,可以用于html页面上变量的渲染,如何来使用thymeleaf,下面通过本文给大家介绍SpringMVC 如何使用thymeleaf进行数据展示,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • Spring DI依赖注入实战教程

    Spring DI依赖注入实战教程

    这篇文章主要介绍了SpringDI依赖注入实战教程,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 详解Java的设计模式编程中的原型模式

    详解Java的设计模式编程中的原型模式

    这篇文章主要介绍了Java的设计模式编程中的原型模式,处理对象复制时要特别注意浅拷贝和深拷贝的问题,需要的朋友可以参考下
    2016-02-02
  • 使用springboot结合vue实现sso单点登录

    使用springboot结合vue实现sso单点登录

    这篇文章主要为大家详细介绍了如何使用springboot+vue实现sso单点登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • JDK8新出Optional类的方法探索与思考分析

    JDK8新出Optional类的方法探索与思考分析

    这篇文章主要为大家介绍了JDK8新出Optional类的发方法示例探索与思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringBoot项目中访问HTML页面的三种方法

    SpringBoot项目中访问HTML页面的三种方法

    这篇文章主要介绍了SpringBoot项目中访问HTML页面的三种方法,文中通过代码示例和图文结合的方式讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • java实现异步线程,回调接口方式

    java实现异步线程,回调接口方式

    这篇文章主要介绍了java实现异步线程,回调接口方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • SpringBoot模拟员工数据库并实现增删改查操作

    SpringBoot模拟员工数据库并实现增删改查操作

    这篇文章主要给大家介绍了关于SpringBoot模拟员工数据库并实现增删改查操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09

最新评论