相关推荐recommended
Spring Boot 整合 Druid
作者:mmseoamin日期:2024-04-30

目录

🍎前言

🍊数据库连接池

🍊为什么需要使用数据库连接池

🍊常见的连接池分类

🍎什么是Druid

🍊Druid的功能

🍊基本配置参数如下:

🍎整合Druid

🍊导入Druid数据源依赖

🍊配置数据源

🍊获取当前数据源

🍊根据需求配置数据源的配置

🍊绑定全局配置文件的参数

🍊配置Druid数据源监控

🍊配置DruidWeb监控Filter的过滤器

🍎总结


🍎前言

🍊数据库连接池

数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中连接进行申请、使用、释放

🍊为什么需要使用数据库连接池

数据库连接是一件费事的操作,连接池可以使得多个操作共享一个连接,数据库连接池就是为数据库建立一个缓冲区。

当需要建立数据库连接时,只需要从缓冲区中取出一个,使用完毕后再放回去;使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接

🍊常见的连接池分类

  1. DBCP连接池:采用标准的java EE JDBC API来实现,同时支持JNDI,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
  2. C3P0连接池:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展
  3. HikariCP连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的JVM资源,可能会造成资源消耗问题
  4. druid连接池:支持JDBC和Oracle驱动程序徐,全面的性能检测,对等分布式,具有强大的扩展功能和高度定制和配置

🍎什么是Druid

Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了c3p0、DBCP等DB池的优点,同时加入了日志监控

spring boot 2.0以上默认使用Hikari数据库连接池,可以说Hikari和Druid都是当前Java web上最优秀的数据库连接池

 我们可以通过以下代码来查看我们所用的是什么连接池

 @Autowired
 private DataSource dataSource;
@Test
 void test(){
    System.out.println(dataSource.getClass());
}

🍊Druid的功能

  1. 监控数据库访问性能
    1. Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,可以很好的监控sql的执行情况
  2. 替换传统的DBCP和c3p0连接池中间件
    1. Druid提供了强大高效,可扩展性的数据库连接池
  3. 扩展JDBC
    1. 如对JDBC层由要求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件
  4. SQL执行日志
    1. Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j、jdkLog,可以按需求选择响应的LogFilter
  5. 数据库密码加密
    1. 数据库密码写在配置文件中,安全性不高

🍊基本配置参数如下:

配置默认值描述

username

连接数据库的用户名

password

连接数据库的密码

jdbcUrl

同DBCP中的jdbcUrl属性

driverClassName

根据url自动识别

这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName

initialSize

0

初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 *参见DBCP中的initialSize属性

maxActive

8

最大连接池数量(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxTotal属性

maxIdle

8

已经不再使用,配置了也没效果*参见DBCP中的maxIdle属性

minIdle

最小连接池数量

maxWait

获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

poolPreparedState- ments

false

是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。

maxOpenPrepared- Statements

-1

要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

testOnBorrow

true

申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

testOnReturn

false

归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

testWhileIdle

false

建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

validationQuery

用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。在mysql中通常为select ‘x’,在oracle中通常为select 1 from dual

timeBetweenEviction-RunsMillis

1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据

minEvictableIdle- TimeMillis

Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。

removeAbandoned

对于建立时间超过removeAbandonedTimeout的连接强制关闭

removeAbandoned-Timeout

指定连接建立多长时间就需要被强制关闭

logAbandoned

false

指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中

filters

属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 1)监控统计用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall

     

🍎整合Druid

🍊导入Druid数据源依赖

注意,我这里用的是springboot3.x版本,这里的druid数据源必须是1.2.19以上

错误导入:


    com.alibaba
    druid-spring-boot-starter
    1.1.17

正确导入:


    com.alibaba
    druid-spring-boot-3-starter
    1.2.21

🍊配置数据源

springboot2.0以上默认使用的是hikari数据源,所以我们需要将数据源指定为Druid

spring:
  datasource:
    #druid数据源配置
    druid:
      username: root # mysql账号
      password: root # mysql 密码
      driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
      url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址

🍊获取当前数据源

随后我们在通过以下方式重新获取一下,得到数据源就是druid的了,证明我们指定的数据源生效了

Spring Boot 整合 Druid,c35ddbec44ab4b058eafd098f24fa5a3.png,第1张

🍊根据需求配置数据源的配置

spring:
  datasource:
    #druid数据源配置
    druid:
      username: root # mysql账号
      password: root # mysql 密码
      driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
      url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址
      # 初始化建立物理连接个数
      initial-size: 5
      # 最小连接数
      min-idle: 5
      # 最大连接数
      max-active: 10
      # 最大等待时间,单位毫秒
      max-wait: 6000
      # 检测连接是否有效
      time-between-eviction-runs-millis: 60000
      # 连接在池中的最小生存时间
      min-evictable-idle-time-millis: 300000
      # 检测连接是否有效的SQL 要求是一个查询语句
      validation-query: SELECT 1 FROM DUAL
      # 这些参数控制何时检测连接的有效性。
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 是否缓存预编译的sql语句
      pool-prepared-statements: true
      # 配置监控统计拦截的filters,stat:监控统计,log4j:日志记录,wall:防御sql注入
      filters: stat,wall,log4j
      # 每个连接可缓存的预编译语句的最大数量。
      max-pool-prepared-statement-per-connection-size: 20 #
      # 是否启用全局的数据统计功能。
      use-global-data-source-stat: true
      # 连接属性,这里设置了合并SQL和慢查询的阈值(毫秒)。
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

注意:这些配置还没生效,因为还没有把自定义属性配置上去

我们在配置文件中配置了最大连接数10,初始化连接数为5

测试一下看看

 @Autowired
 private DataSource dataSource;
@Test
 void test(){
    DruidDataSource druidDataSource = (DruidDataSource)dataSource;
    System.out.println("最大连接数:" + druidDataSource.getMaxActive());
    System.out.println("初始化连接数:" + druidDataSource.getInitialSize());
}

发现是8和0是错的。

Spring Boot 整合 Druid,4d4c7e603477497c814ce265fc9f1f00.png,第2张

因为上面的配置用到了日志,我们需要导入一下log4j的依赖


        
            log4j
            log4j
            1.2.17
        

🍊绑定全局配置文件的参数

package com.sxy.recordnetwork.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
 * druid配置类
 */
@Configuration
public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

然后我们再测试已经成功了

Spring Boot 整合 Druid,e15f7a7316214311bace75824eb7cad2.png,第3张

🍊配置Druid数据源监控

Druid提供了具有监控的功能,提供了一个web界面供用户查看,我们得设置Druid后台管理页面,如登录账号、密码等

spring:
  datasource:
    #druid数据源配置
    druid:
        // 其他配置
      # 配置可视化控制台页面
      stat-view-servlet:
        enabled: true
        # 访问druid监控页面的地址
        url-pattern: /druid/*
#        IP 白名单 没有配置或者为空则允许所有访问
        allow:
          # IP黑名单,若白名单也存在则优先使用
        deny:
        # 禁用重置按钮
        reset-enable: true
        # 登录所用的用户名与密码
        login-username: admin
        login-password: 123456

随后就可以访问监控页面了

Spring Boot 整合 Druid,dde910a4526b47f69b1c3b31b2d3d6cc.png,第4张

🍊配置DruidWeb监控Filter的过滤器

spring:
  datasource:
    #druid数据源配置
    druid:
       #配置过滤器,过滤掉静态文件
        web-stat-filter:
         enabled: true
         url-pattern: /*
         exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico

配置以上即可

🍎总结

以上就是Spring Boot3.x整合Druid的大致流程。

有什么问题还请各位在下方评论区留言,感谢支持!!!

更多内容请关注我的微信订阅号哦~

Spring Boot 整合 Druid,ebc780c7f45b44ff86dbd6d791c457f4.jpg,第5张