druid官方文档
https://github.com/alibaba/druid
https://github.com/alibaba/druid/wiki
druid maven仓库
https://mvnrepository.com/artifact/com.alibaba/druid

一、druid和druid-spring-boot-starter区别分析

参考文章https://www.cnblogs.com/dxiaodang/p/14571590.html

主要原因还是要不要手动写配置类,spring boot 的使用 auto帮我们封装好了属性值

描述如下:

  1. 作用是一样的,都是连接池提供连接,里边的配置参数都是一样的;
  2. druid-spring-boot-starter只是在druid基础上进行了一次封装,专门用来整合spring-boot项目;
    如果springboot项目想使用druid也是可以的,但是需要手动编写配置类并注入到bean中,并加载对应的配置参数;但是不建议,明明有现成封装好的jar,就直接使用就好了!!!

所以建议改用druid-spring-boot-starter依赖。

pom文件

		<!--Druid-->
		<!--可以不配这个因为druid-spring-boot-starter里面已经有了,随便带着一下这个依赖,代码可读性高一点,反正对其他啥也没影响-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

        <!--    Druid Spring Boot 组件-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

在这里插入图片描述
并且在application.yml文件中配置如下内容:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
	driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test01
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  druid:
    #   Druid数据源配置
    # 初始连接数
    initialSize: 5
    # 最小连接池数量
    minIdle: 10
    # 最大连接池数量
    maxActive: 20
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 配置一个连接在池中最大生存的时间,单位是毫秒
    maxEvictableIdleTimeMillis: 900000
    # 配置检测连接是否有效
    validationQuery: SELECT 1
    #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
    testWhileIdle: true
    #配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
    testOnBorrow: false
    #配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
    testOnReturn: false
    #打开PsCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,log4j
    #合并多个DruidDatasource的监控数据
    useGlobalDataSourceStat: true
    #通过connectProperties属性来打开mergesql功能罗慢sQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;

如此就不需要单独对DruidDatasource写个配置类了。

也可参考这篇文章的yaml文件配置:https://blog.csdn.net/yzh_1346983557/article/details/117673280


二、springboot项目中提示报错Cannot resolve configuration property ‘spring.datasource.xxxx’

1、问题发现:
定位接口无响应问题时,发现是由于数据库挂了导致的;但是不应该呀,数据库连接池设置了最大等待超时时间还是有返回的,然后深入解读代码,发现是配置参数有问题
在这里插入图片描述
2、分析
问题1:为什么datasource下边就没有这些参数,这样子配置居然没有报错,只是提示? —> 原来spring-boot是可以配置不存在的key值,只要保证格式正确,在加载的时候不会解析错误的key
问题2:那应该怎么配置? ——> 查看源码分析

(1)第一步:
先找到druid配置类 —> spring-boot-starter的自动配置类基本都是xxxxxAutoConfigure 或xxxxxAutoConfiguration
发现druid配置类中注入了一个DruidDataSourceWrapper实例,且用@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})开启@ConfigurationProperties注解配置
在这里插入图片描述
(2)第二步:
找到对应的bean实例DruidDataSourceWrapper,发现使用注解@ConfigurationProperties配置了前缀:spring.datasource.druid,把该前缀开头的主配置文件中配置属性设置到对于的Bean属性上
在这里插入图片描述
(3)第三步:
Bean本身没有属性,都是继承抽象类父类的属性,基本都设置了默认值。
在这里插入图片描述
在这里插入图片描述
3、配置文件
参考如下配置

spring:
  #数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://192.168.100.99:3306/energy_storage_test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      initial-size: 5   # 初始化大小
      min-idle: 5       # 最小空闲连接个数
      max-active: 20    # 最大连接个数
      max-wait: 60000   # 配置获取连接等待超时的时间
      time-between-eviction-runs-millis: 60000    # 配置间隔多久才进行一次监测,监测需要关闭的空闲连接,单位时毫秒
      min-evictable-idle-time-millis: 60000       # 配置一个连接在池中最小生存的时间
      validation-query: select 'x'                # 用来监测连接是否有效的sql,要求是一个查询语句
      test-while-idle: true            # 建议配置为true,不影响性能,并且保证安全性。如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-on-borrow: false            # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
      test-on-return: false            # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
      pool-prepared-statements: true   # 打开PSCache,并且指定每个连接上PSCache的大小
      max-open-prepared-statements: 20
      filter:
        commons-log:
        connection-logger-name: stat,wall,log4j   # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,此处是filter修改的地方

3、总结
①springboot项目整合druid,建议使用druid-spring-boot-strater,但是不代表druid一定不可以使用,有兴趣的可以自己试试
②配置yaml文件时,一定要使用druid下边的参数,要不然不起作用


三、Hikari连接池

springboot2.0默认集成了hikari连接池,号称史上性能最好,速度最快的连接池,自动装配原理都一样,大家可以试试,下面附上常用的一些参数配置

spring:
  datasource:
    username: dangbo
    password: dangbo
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306?auth_shiro
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimum-idle: 5           # 最小空闲数,默认值为10
      maximum-pool-size: 15     # 最大连接数,默认值为10
      auto-commit: true         # 控制从池返回的连接的默认自动提交行为
      idle-timeout: 30000       # 控制允许连接在池中闲置的最长时间,默认值10min
      pool-name: DatebookHikariCP   # 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置。 默认:自动生成
      max-lifetime: 1800000     # 池中连接的最大生存期,默认值30min
      connection-timeout: 30000 # 控制客户端将等待来自池的连接的最大毫秒数,默认值为30s
      connection-test-query: SELECT 'x'

hikari配置参考于https://blog.csdn.net/Maskkiss/article/details/82115149

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐