1.Druid是什么

Druid是一个开源的数据库连接池和监控平台。它由阿里巴巴公司开发,并在Apache许可证下发布。Druid旨在提供高性能、可扩展、安全可靠的数据库连接池,并同时支持实时监控和统计数据库访问的性能指标。

1.Druid的特点

  1. 高性能:Druid使用了一系列的优化策略,包括预编译语句、连接池复用、本地缓存等,以提升数据库访问的性能和响应速度。
  2. 可扩展性:Druid连接池支持连接池大小的动态调整,可以根据应用的负载情况和数据库的性能需求来灵活配置连接池的大小。同时,Druid还支持多数据源的管理,可以通过配置多个数据源来满足多个数据库的访问需求。
  3. 安全可靠:Druid提供了各种安全和可靠的特性,包括数据库密码加密、防SQL注入、防止恶意访问等。它还支持连接池的健康检查和自动恢复,确保数据库连接的稳定和可靠性。
  4. 实时监控:Druid内置了丰富的监控和统计功能,可以实时收集和展示数据库访问的性能指标,包括连接池的使用情况、SQL执行时间、慢查询分析等。通过监控平台可以全面了解数据库的性能状况,并及时发现和解决潜在的问题。

2.Druid 可以做什么

  • 数据库连接池管理:Druid连接池提供高性能、可扩展的数据库连接池,用于管理数据库连接的创建、复用和释放。连接池可以根据应用的负载情况动态调整连接的数量,并提供连接池健康检查和自动恢复机制。
  • 连接池监控:Druid内置了一个监控平台,可以实时监控连接池的使用情况。通过监控平台,您可以查看活跃连接数、空闲连接数、连接等待时间等指标。这使您能够及时发现连接池的性能问题,并作出相应的优化调整。
  • SQL执行性能监控:Druid可以记录每个SQL语句的执行时间、返回结果行数等性能指标。通过监控平台,您可以实时查看SQL的执行情况,并分析和优化慢查询。这有助于提升数据库访问的性能和响应速度。
  • 防御SQL注入:Druid提供内置的SQL注入防御功能。它可以自动检测和拦截恶意的SQL注入,保护数据库的安全性。这是通过将注入的特征与SQL语句进行匹配来实现的。
  • 数据库连接池的配置灵活性:Druid允许您通过配置文件来灵活地配置连接池的参数。您可以设置最大连接数、最小空闲连接数、连接超时时间等。通过适当的配置调整,可以满足不同应用场景下的数据库访问需求。
  • SQL语句的统计和分析:Druid可以对SQL语句进行统计和分析。它可以记录总执行次数、平均执行时间、执行错误次数等统计数据。这有助于了解不同SQL语句的执行情况,并从中找出性能瓶颈和优化空间。
  • 多数据源管理:Druid支持管理多个数据源。您可以通过配置多个数据源来满足复杂应用中对多个数据库的访问需求。这使您能够灵活地管理和操作多个数据库连接。

3.Druid的参数

  • initialSize (初始连接数): 连接池启动时创建的初始连接数,默认为0。可以根据应用需求调整。
  • maxActive (最大活跃连接数): 连接池中允许存在的最大活跃连接数,默认为8。根据数据库负载和系统性能进行调整。
  • minIdle (最小空闲连接数): 连接池中保持的最小空闲连接数,默认为0。连接池将保持至少这么多数量的空闲连接。
  • maxIdle (最大空闲连接数): 连接池中允许存在的最大空闲连接数,默认为8。超过这个数量的空闲连接将被回收。
  • maxWait (最大等待时间): 获取连接时的最大等待时间,单位为毫秒,默认为-1,表示不限制等待时间。如果连接池已满且达到最大等待时间,则获取连接操作将抛出超时异常。
  • validationQuery (连接验证查询): 用于校验连接是否可用的SQL查询语句。连接池会定时执行该查询语句来检查连接的有效性。
  • validationQueryTimeout (连接验证查询超时时间): 验证查询的超时时间,单位为秒,默认为1秒。
  • testWhileIdle (空闲连接检测): 连接池在将连接放入空闲状态时,是否执行连接的空闲检测,默认为false。如果设置为true,将定时检测连接的可用性。
  • testOnBorrow (取出连接时检测): 连接池在从池中取出连接时,是否执行连接的可用性检测,默认为false。如果设置为true,将在取出连接之前先进行连接的可用性检查。
  • testOnReturn (归还连接时检测): 连接池在归还连接到池中时,是否执行连接的可用性检测,默认为false。如果设置为true,将在归还连接时进行连接的可用性检查。
  • timeBetweenEvictionRunsMillis (空闲连接检测时间间隔): 执行空闲连接检测的时间间隔,单位为毫秒,默认为-1,表示不执行空闲连接检测。
  • minEvictableIdleTimeMillis (最小可回收空闲连接时间): 连接池中的连接在空闲一定时间后,将被回收,单位为毫秒,默认为1000 * 60 * 30。可以根据应用负载和数据库性能来调整此参数。
  • maxEvictableIdleTimeMillis (最大可回收空闲连接时间): 连接池中的连接允许保持的最大空闲时间,单位为毫秒,默认为-1,表示不限制空闲时间。
  • poolPreparedStatements (是否缓存PreparedStatement): 是否缓存PreparedStatement,默认为false。开启缓存可以提高数据库查询性能。
  • maxOpenPreparedStatements (最大缓存PreparedStatement数): 缓存的最大PreparedStatement数量,默认为-1,表示不限制。
  • filters (连接过滤器): 连接过滤器的类名,多个过滤器之间使用逗号分隔。
  • proxyFilters (代理连接过滤器): 代理连接过滤器的类名,多个过滤器之间使用逗号分隔。代理过滤器可以在SQL执行前后做一些额外处理。
  • statLogger (统计日志记录器): 统计日志记录器的类名,用于记录连接池的统计信息。
  • keepAlive (保持长连接): 是否保持长连接,默认为false。如果设置为true,连接池将定期发送心跳查询以保持连接的活跃状态。
  • keepAliveBetweenTimeMillis (保持长连接的时间间隔): 保持长连接时执行心跳查询的时间间隔,单位为毫秒,默认为-1,表示使用数据库默认的心跳间隔。
  • connectionProperties (连接属性): 设置额外的连接属性,多个属性之间使用分号分隔,例如"charset=utf-8;ssl=true"。
  • connectProperties (连接参数): 设置额外的连接参数,如编码、SSL等,格式为键值对形式的字符串。
  • useGlobalDataSourceStat (使用全局数据源统计): 是否使用全局数据源统计,默认为false。如果设置为true,则全局数据源统计将被启用。
  • useUnfairLock (使用不公平锁): 是否使用不公平锁,默认为false。如果设置为true,则连接池将使用不公平锁策略。
  • asyncInit (异步初始化): 是否异步初始化连接池,默认为false。如果设置为true,则连接池的初始化将在后台线程中异步执行。
  • logAbandoned (记录废弃连接): 是否记录废弃的连接,默认为false。如果设置为true,连接池将会记录废弃连接的信息。
  • removeAbandoned (移除废弃连接): 是否移除废弃的连接,默认为false。如果设置为true,连接池将在超过removeAbandonedTimeout指定的时间后移除废弃的连接。
  • removeAbandonedTimeout (废弃连接超时时间): 废弃连接的超时时间,单位为秒,默认为60秒。
  • logDifferentThread (记录不同线程的连接使用): 是否记录不同线程之间使用的相同连接的信息,默认为false。如果设置为true,连接池将会记录不同线程使用相同连接的情况。
  • useLocalSessionState (使用本地会话状态): 是否使用本地会话状态,默认为false。如果设置为true,连接池将会为每个连接创建一个本地会话状态。
  • useServerPreparedStmts (使用服务器准备的语句): 是否使用服务器准备的语句,默认为false。如果设置为true,连接池将使用服务器准备的语句来优化性能。
  • enableAutoCommitOnReturn (归还连接时自动提交): 是否在归还连接时自动提交事务,默认为true。如果设置为false,连接池将在归还连接时不自动提交事务。
  • transactionThresholdMillis (事务阈值时间): 事务执行时间的阈值,单位为毫秒,默认为5000毫秒。如果超过阈值,则被判定为慢事务。
  • failFast (快速失败): 是否快速失败,默认为true。如果设置为true,连接池在连接不可用时会快速失败,不会进行重试。
  • exceptionSorter (异常排序器): 异常排序器的类名,用于判断不可用连接的异常类型。
  • maxCreateTaskCount (最大创建连接任务数): 最大的创建连接任务数,默认为3。如果创建连接的任务数达到这个限制,后续的创建连接任务将被拒绝。
  • initExceptionThrow (初始化时抛出异常): 初始化连接池时是否抛出异常,默认为false。如果设置为true,连接池在初始化过程中如果发生异常将会抛出。
  • defaultQueryTimeout (默认查询超时时间): 默认的查询超时时间,单位为秒,默认为-1,表示不设置超时。
  • defaultTransactionIsolation (默认事务隔离级别): 默认的事务隔离级别,默认为未设置。可以设置为以下值之一
    "NONE"、"READ_UNCOMMITTED"、"READ_COMMITTED"、"REPEATABLE_READ"、"SERIALIZABLE"。
  • allowPoolSuspension (允许连接池挂起): 是否允许连接池挂起,默认为false。如果设置为true,连接池可以在需要时挂起,以避免资源浪费。
  • createScheduler (创建调度器): 创建连接池时使用的调度器的类名。调度器用于执行连接池的后台任务,如定期检查空闲连接和验证连接等。
  • destroyScheduler (销毁调度器): 销毁连接池时使用的调度器的类名。销毁调度器将停止后台任务的执行。
  • resetStatEnable (重置统计信息): 是否启用连接池的统计信息重置,默认为false。如果设置为true,会在连接池每次获取连接时重置统计信息。
  • initGlobalVariants (初始化全局变量): 是否初始化全局变量,默认为false。如果设置为true,连接池将初始化全局变量。
  • clearFiltersEnable (清除过滤器): 是否启用清除过滤器,默认为false。如果设置为true,连接池在归还连接时会清除过滤器。
  • logThrowAbandoned (记录废弃连接异常): 是否记录废弃连接的异常,默认为false。如果设置为true,连接池将记录废弃连接引起的异常信息。
  • notFullTimeoutRetryCount (未满连接超时重试次数): 获取连接时,如果连接池未满且等待超时,重试获取连接的次数,默认为0。如果设置大于0,则会进行重试。
  • dataSource (数据源): 数据源的唯一标识符,默认为空。可以在多数据源环境中使用此参数来标识不同的数据源。

4.集成Druid

4.1.依赖引入

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

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

<!-- 引入jdbc-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

4.2.修改配置文件

由于springboot2.x版本以后默认集成的数据源是Hikari,因此我们想要使用Druid需要去指定下,也就是指定type内容

datasource:
    # 数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    # 数据库链接地址
    url: jdbc:mysql://localhost:3306/zhuhuo-blog?useUnicode=true&characterEncoding=utf-8&seSSL=false&useTimezone=true&serverTimezone=GMT%2B8
    # 用户名 数据库的用户名 自行替换
    username: root
    # 密码   数据库的密码 自行替换
    password: 12345678
    # 驱动名称
    driver-class-name: com.mysql.cj.jdbc.Driver
    # druid 相关参数配置
    druid:
      # 最小连接池数量
      minIdle: 5
      # 最大连接池数量
      maxActive: 20
      # 初始化时建立物理连接的个数
      initialSize: 5
      # 连接时最大等待时间 单位毫秒
      maxWait: 50000
      # 检测连接是否有效的sql
      validationQuery: SELECT 1 FROM DUAL
      # 检测连接的间隔时间
      timeBetweenEvictionRunsMillis: 90000
      # 连接保持空闲而不被驱逐的最小时间
      minEvictableIdleTimeMillis: 300000
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
      testWhileIdle: true
      # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnBorrow: false
      # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn: false
      # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
      poolPreparedStatements: false
      # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
      # 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
      # maxPoolPreparedStatementPerConnectionSize: 0
      # 通过别名的方式配置扩展插件  监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
      filter:
        stat:
          enabled: true
          # 是否开启慢sql
          log-slow-sql: true
          # 是否开启SQL合并
          merge-sql: true
          # 慢sql的时间标准 单位:毫秒
          slow-sql-millis: 1000
      #  监控统计用的filter:stat
      web-stat-filter:
        # 是否启用StatFilter默认值true
        enabled: true
        # 过滤匹配规则
        url-pattern: /*
        # 过滤忽略的格式
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico
      # 内置监控页面相关
      stat-view-servlet:
        # 是否启用StatViewServlet
        enabled: true
        # 登录名
        login-username: root
        # 登陆密码
        login-password: root
        # 允许清空统计数据
        reset-enable: true
        # 内置监控页面访问路径 首页默认是 /druid/index.html
        url-pattern: /druid/*

4.3.启动测试

006集成Druid_数据库