网站首页 文章专栏 深入druid之druid的使用详解
深入druid之druid的使用详解

一. druid的引入使用

新建maven项目,导入springboot的依赖即可,版本有很多,选择合适的版本

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.6</version>
    <optional>true</optional>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.1.0.RELEASE</version>
    <exclusions><!-- 去掉默认配置 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--DB -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

<!--pagehelper-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
    <exclusions>
        <exclusion>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <groupId>org.mybatis.spring.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

二. 配置详解

配置有几种形式,yml和properties都行,看个人喜欢

spring:
  datasource:
    username: test
    password: test
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource            # 数据库连接池类别
    druid:
      initial-size: 5                                       # 初始化大小
      min-idle: 10                                          # 最小连接数
      max-active: 20                                        # 最大连接数
      max-wait: 60000                                       # 获取连接时的最大等待时间
      min-evictable-idle-time-millis: 300000                # 一个连接在池中最小生存的时间,单位是毫秒
      time-between-eviction-runs-millis: 60000              # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
      filters: stat,wall                              # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计
      validation-query: SELECT 1                            # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
      test-on-borrow: true                                  # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
      test-on-return: true                                  # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
      test-while-idle: true                                 # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
      stat-view-servlet:
        enabled: true                                       # 是否开启 StatViewServlet
        allow: 127.0.0.1                                    # 访问监控页面 白名单,默认127.0.0.1
        deny: 192.168.56.1                                  # 访问监控页面 黑名单
        login-username: admin                               # 访问监控页面 登陆账号
        login-password: admin                               # 访问监控页面 登陆密码
      filter:
        stat:
          enabled: true                                     # 是否开启 FilterStat,默认true
          log-slow-sql: true                                # 是否开启 慢SQL 记录,默认false
          slow-sql-millis: 5000                             # 慢 SQL 的标准,默认 3000,单位:毫秒
          merge-sql: false                                  # 合并多个连接池的监控数据,默认false
        wall:
          log-violation: true
      reset-stat-enable: true


如上就是一个较为完整的配置了,每个属性配置都有特殊的含义,我们看几个关键的配置

1,连接池大小相关参数

initial-size: 5                                       # 初始化大小
min-idle: 10                                          # 最小连接数
max-active: 20                                        # 最大连接数

初始化大小,以及最小连接数默认都为0,最大默认为8,这个就是连接池中的连接个数了,可以根据项目大小,配置初始化个数

2,连接参数

#-------------基本属性--------------------------------
url: jdbc:mysql://localhost:3306/github_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
username: root
password: root
#数据源名,当配置多数据源时可以用于区分。注意,1.0.5版本及更早版本不支持配置该项
#默认"DataSource-" + System.identityHashCode(this)
name: zzs001
#如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
driverClassName=com.mysql.cj.jdbc.Driver

3,检查连接参数

min-evictable-idle-time-millis: 300000                # 一个连接在池中最小生存的时间,单位是毫秒
time-between-eviction-runs-millis: 60000              # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
validation-query: SELECT 1                            # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
test-on-borrow: true                                  # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
test-on-return: true                                  # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
test-while-idle: true                                 # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能

time-between-eviction-runs-millis 参数有两个含义: 

#1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 

#2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明


4,缓存语句

#-------------缓存语句-------------------------------- 
#是否缓存preparedStatement,也就是PSCache。 
#PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭 
#默认为false 
poolPreparedStatements: false 
#PSCache的最大个数。 
#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 
#在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 
#默认为10 
maxOpenPreparedStatements: 10

5,连接泄露回收参数

#-------------连接泄漏回收参数--------------------------------
#当未使用的时间超过removeAbandonedTimeout时,是否视该连接为泄露连接并删除
#默认为false
removeAbandoned: false

#泄露的连接可以被删除的超时值, 单位毫秒
#默认为300*1000
removeAbandonedTimeoutMillis: 300*1000

#标记当Statement或连接被泄露时是否打印程序的stack traces日志。
#默认为false
logAbandoned: true

#连接最大存活时间
#默认-1
#phyTimeoutMillis: -1

6,配置监控

     filters: stat,wall                              # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计
     stat-view-servlet:
        enabled: true                                       # 是否开启 StatViewServlet
        allow: 127.0.0.1                                    # 访问监控页面 白名单,默认127.0.0.1
        deny: 192.168.56.1                                  # 访问监控页面 黑名单
        login-username: admin                               # 访问监控页面 登陆账号
        login-password: admin                               # 访问监控页面 登陆密码
      filter:
        stat:
          enabled: true                                     # 是否开启 FilterStat,默认true
          log-slow-sql: true                                # 是否开启 慢SQL 记录,默认false
          slow-sql-millis: 5000                             # 慢 SQL 的标准,默认 3000,单位:毫秒
          merge-sql: false                                  # 合并多个连接池的监控数据,默认false

merge-sql: false 配置可以配置合并sql,将sql相同,值不同的sql归为一类

allow,deny可以配置监控页面访问的黑白名单

判断规则:

    deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。

    如果allow没有配置或者为空,则允许所有访问

7,防止sql注入

开启WallFilter

#过滤器
filters=stat,wall

常见配置如下:

参数缺省值描述
wall.logViolationfalse对被认为是攻击的SQL进行LOG.error输出
wall.throwExceptiontrue对被认为是攻击的SQL抛出SQLException
wall.updateAllowtrue是否允许执行UPDATE语句
wall.deleteAllowtrue是否允许执行DELETE语句
wall.insertAllowtrue是否允许执行INSERT语句
wall.selelctAllowtrue否允许执行SELECT语句
wall.multiStatementAllowfalse是否允许一次执行多条语句,缺省关闭
wall.selectLimit-1

配置最大返回行数

如果select语句没有指定最大返回行数

会自动修改selct添加返回限制

wall.updateWhereNoneCheckfalse

检查UPDATE语句是否无where条

件这是有风险的

但不是SQL注入类型的风险

wall.deleteWhereNoneCheckfalse

检查DELETE语句是否无where条

件这是有风险的

但不是SQL注入类型的风险


三. 监控

通过druid内置的页面即可访问,http://localhost:8888/druid/wall.html,账号密码为配置文件的所配置的

1636993873(1).jpg

1636993898(1).jpg

1636994154(1).jpg

1636994184(1).jpg


如上便是一个druid连接池的全部信息,可以监控相关参数,以及sql的执行,还可以看出可以对异常sql的检查。

简单的使用今天就先到这,之前其实写完了,保存失败了。。。又重写的




版权声明:本文由星尘阁原创出品,转载请注明出处!

本文链接:http://www.52xingchen.cn/detail/94




赞助本站,网站的发展离不开你们的支持!
来说两句吧
大侠留个名吧,或者可以使用QQ登录。
: 您已登陆!可以继续留言。
最新评论