# druid - 快速入门

# 1. 连接池简介

连接池:

  • 不常用: c3p0 / dbcp / tomca-jdbc
  • 主流: hikariCP / druid

druid:

  • 德鲁伊 / 德鲁的
  • 为监控而生的数据库连接池

文档:

  • https://github.com/alibaba/druid/wiki/
  • https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

# 依赖

<!-- springboot 2.7.5 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.5</version>
    <relativePath/>
</parent>

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

# 连接池配置

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver

      url: jdbc:mysql://localhost:3306/ssm_db
      username: root
      password: 123456

      # 初始化时建立的物理连接的个数
      initialSize: 5 

      # 连接池包含连接的最大数量
      maxActive: 20 

      # 获取连接时,(暂时没有连接可用时)最大等待时间(ms)
      maxWait: 60000 

      # 连接池至少存在的连接数
      minIdle: 1

      # 申请连接时,是否执行 validationQuery 检查连接的有效性,影响性能
      testOnBorrow: false

      # 归还连接时,是否执行 validationQuery 检查连接的有效性,影响性能
      testOnReturn: false

      # mysql: show variables like '%timeout%'
      # 当 连接长时间(默认 8h)不使用时,数据库会主动关闭连接

      # 连接保持空闲而不被销毁的最小时间
      # 单位 ms,默认 30 min
      minEvictableIdleTimeMillis: 1800000

      # 连接保持空闲而不被销毁的最大时间
      # 单位 ms,默认 7 h
      maxEvictableIdleTimeMillis: 25200000

      # 销毁线程是另一个线程,该配置决定销毁线程运行周期
      # 单位 ms,默认 1 min
      timeBetweenEvictionRunsMillis: 60000

      # 申请连接时,如果 空闲时间 > timeBetweenEvictionRunsMillis,则执行 validationQuery 检查连接是否有效
      # 类似 testOnBorrow,但对性能的影响想对较小
      testWhileIdle: true

      # 通过执行指定 sql 检测连接是否有效
      validationQuery: select 1

# 监控配置

spring:
  datasource:
    druid:
      # ...

      # 启用 druid 监控,并设置访问路径
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*

      filter:
        # 页签: SQL 监控
        # 作用: 主要用于查看执行了哪些 SQL 语句(执行耗时,次数)
        # 文档: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
        stat:
          enabled: true
          merge-sql: true
          log-slow-sql: true
          # 慢SQL,默认 3 秒
          slow-sql-millis: 3000

        # 页签: SQL 防火墙
        # 作用: 按照配置,检查 SQL 语句是否合法,比如 deleteAllow(是否允许执行DELETE语句)
        # 文档: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
        wall:
          enabled: true
          db-type: mysql

        # 文档: 打印日志
        # 作用: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
        # 配置: logback-spring.xml
        slf4j:
          enabled: true
          statement-executable-sql-log-enable: true

      # 页签: Web 应用、URI 监控、Session监控
      # 作用: 针对 web 的监控
      # 文档: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
      web-stat-filter:
        enabled: true
        session-stat-enable: true
        # principal-session-name: username.druid
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        profile-enable: true

      # 页签: Spring 监控
      aop-patterns: com.labwind.modules.*.service.*

logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback-spring</contextName>
    <property name="LOG_PATTERN"
              value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n"/>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 对日志进行格式化 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="druid.sql" level="debug" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>

    <root level="info">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>
本章目录