Druid使用基础

功能

Druid是一个数据库连接池,并且提供了一下功能:

  • 监控SQL

    通过stat监控sql语句的执行

  • SQL防注入

    通过wall防注入

  • 数据库密码加密

    通过config提供数据库密码加密

  • 自定义filter

    通过继承FilterEventAdaptar实现自定义Filter功能

使用配置

Druid的配置有不少坑,请注意。

依赖

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

这里要注意版本号,选择1.1.20

配置

从网上看,durid配置有2种方式,一种是yml配置,另外一种是配置类方式

这里直接采用yml配置配置的方式,配置文件如下:

public-key: xxxx你的公钥xxxx
spring:
  redis:
    host: localhost
    port: 6379
    password:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      username: root
      password: xxxx你的加密后密码xxxx
      url: jdbc:mysql://localhost:3306/smart_auth?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
      driver-class-name: com.mysql.cj.jdbc.Driver
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置获取连接等待超时的时间
      max-wait: 60000
      #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: conn,stat,wall,slf4j,config
      connection-properties: config.decrypt=true;config.decrypt.key=${public-key};
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      validation-query: select 'x'
      # 打开PSCache,并且指定每个连接上PSCache的大小
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      use-global-data-source-stat: true
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: admin
        reset-enable: false
        url-pattern: /druid/*
        allow: 127.0.0.1
      web-stat-filter:
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 3000
          merge-sql: true
        wall:
          enabled: true
          db-type: mysql
          config:
            drop-table-allow: false
#            delete-allow: false
            multi-statement-allow: true

配置上有2点小坑:

  • 如果采用配置类方式,是需要结合yml中的datasource的,这时候,druid的配置需要在datasouce下,不能直接在druid下。

  • 版本差异

    1.1.10版本下,stat-view-servlet.enabled是不需要设置的,而在1.1.20版本下stat-view-servlet-enabled:true必须设置,否则不能访问druid界面。

要点

SQL监控

  • SQL监控用的是stat,需要在filters中增加stat

  • 通过stat-view-servlet配置登录的账号、密码

  • 通过filter.stat配置其他参数

  • 通过http://127.0.0.1:8080/druid/index.htm,8080是spring启动的端口

注意:如果启动security,需要在WebSecurityConfigurer中忽略掉/druid/**

SQL防注入

  • 使用wall来进行防注入,filters中增加wall

  • 配置wall

    druid.filter.wall.enabled=true

    druid.filter.wall.config.db-type=mysql

    druid.filter.wall.config.drop-table-allow=false //不能执行drop表

    druid.filter.wall.config.delete-allow=false //不能执行delete

数据库密码加密

  • 使用config来进行数据库账号、密码加密,filters中增加config

  • 生成秘钥

    cd druid-1.1.20.jar所在目录,如~/.m2/repository/com/alibaba/druid/1.1.20

    java -cp druid-1.1.20.jar com.alibaba.druid.filter.config.ConfigTools 你的密码

    生成了privateKey,publicKey,password

  • 配置config

    filters中增加config

    修改password为生成的密码

    连接时使用公钥:

    connection-properties: config.decrypt=true;config.decrypt.key=${public-key};
    public-key: 你的公钥

    这里有个小坑,druid还有一个connect-properties的配置,很有迷惑性,千万不能配置到它下。

参考:参考1参考2参考3

自定义扩展

  • 继承FilterEventAdapter

    @Slf4j
    public class ConnectionLogFilter extends FilterEventAdapter {
    
        @Override
        public void connection_connectBefore(FilterChain chain, Properties info) {
            log.info("BEFORE CONNECTION!");
        }
    
        @Override
        public void connection_connectAfter(ConnectionProxy connection) {
            log.info("AFTER CONNECTION!");
        }
    }
    
  • 配置ConnectionLogFilter的别名

    在resource的META-INF下创建druid-filter.properties,输入:

    druid.filters.conn=com.duobang.auth.interceptor.ConnectionLogFilter

    com.duobang.auth.interceptor修改为你的包名

  • 配置config

    在filters中增加conn

    filters: conn,stat,wall,slf4j,config

# spring 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×