乐趣区

关于程序员:SpringBoot整合Druid

Druid 简介

Java 程序很大一部分要操作数据库,为了进步性能操作数据库的时候,又不得不应用数据库连接池。

Druid 是阿里巴巴开源平台上一个数据库连接池实现,联合了 C3P0、DBCP 等 DB 池的长处,同时退出了日志监控。

Druid 能够很好的监控 DB 池连贯和 SQL 的执行状况,天生就是针对监控而生的 DB 连接池。

Druid 曾经在阿里巴巴部署了超过 600 个利用,通过一年多生产环境大规模部署的严苛考验。

Spring Boot 2.0 以上默认应用 Hikari 数据源,能够说 Hikari 与 Driud 都是以后 Java Web 上最优良的数据源,咱们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。

Github 地址:https://github.com/alibaba/dr…

官网 wiki:wiki

简略应用

Spring Boot 默认的数据源是

  • 2.0 之前org.apache.tomcat.jdbc.pool.DataSource
  • 2.0 及之后: com.zaxxer.hikari.HikariDataSource

在 springboot 中切换数据源非常简单 ,只须要在配置文件中指定 spring.datasource.type 为咱们指定的类型就好了。

eg:spring.datassource.type=com.alibaba.druid.pool.DruidDataSource

这样就实现切换咱们的数据源为 Druid。这个 type 的值是 DataSource 的接口的实现。

Druid 各项配置

配置 缺省值 阐明
name 配置这个属性的意义在于,如果存在多个数据源,监控的时候能够通过名字来辨别开来。如果没有配置,将会生成一个名字,格局是:”DataSource-“+ System.identityHashCode(this). 另外配置此属性至多在 1.0.5 版本中是不起作用的,强行设置 name 会出错。
url 连贯数据库的 url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 连贯数据库的用户名
password 连贯数据库的明码。如果你不心愿明码间接写在配置文件中,能够应用 ConfigFilter。具体看这里
driverClassName 依据 url 自动识别 这一项可配可不配,如果不配置 druid 会依据 url 自动识别 dbType,而后抉择相应的 driverClassName
initialSize 0 初始化时建设物理连贯的个数。初始化产生在显示调用 init 办法,或者第一次 getConnection 时
maxActive 8 最大连接池数量
maxIdle 8 曾经不再应用,配置了也没成果
minIdle 最小连接池数量
maxWait 获取连贯时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用偏心锁,并发效率会有所降落,如果须要能够通过配置 useUnfairLock 属性为 true 应用非偏心锁。
poolPreparedStatements false 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。
maxPoolPreparedStatementPerConnectionSize -1 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,能够把这个数值配置大一些,比如说 100
validationQuery 用来检测连贯是否无效的 sql,要求是一个查问语句,罕用 select‘x’。如果 validationQuery 为 null,testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。
validationQueryTimeout 单位:秒,检测连贯是否无效的超时工夫。底层调用 jdbc Statement 对象的 void setQueryTimeout(int seconds)办法
testOnBorrow true 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。
testOnReturn false 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。
testWhileIdle false 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。
keepAlive false(1.0.28) 连接池中的 minIdle 数量以内的连贯,闲暇工夫超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。
timeBetweenEvictionRunsMillis 1 分钟(1.0.14) 有两个含意:1) Destroy 线程会检测连贯的间隔时间,如果连贯闲暇工夫大于等于 minEvictableIdleTimeMillis 则敞开物理连贯。2) testWhileIdle 的判断根据,具体看 testWhileIdle 属性的阐明
numTestsPerEvictionRun 30 分钟(1.0.14) 不再应用,一个 DruidDataSource 只反对一个 EvictionRun
minEvictableIdleTimeMillis 连贯放弃闲暇而不被驱赶的最小工夫
connectionInitSqls 物理连贯初始化的时候执行的 sql
exceptionSorter 依据 dbType 自动识别 当数据库抛出一些不可复原的异样时,摈弃连贯
filters 属性类型是字符串,通过别名的形式配置扩大插件,罕用的插件有:监控统计用的 filter:stat 日志用的 filter:log4j 进攻 sql 注入的 filter:wall
proxyFilters 类型是 List<com.alibaba.druid.filter.Filter>,如果同时配置了 filters 和 proxyFilters,是组合关系,并非替换关系

不应用启动器

  • 增加依赖
<!--jdbc-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!--Druid-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>


<!--mysql 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtimen</scope>
</dependency>


<!--web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--test-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
  • 批改配置

咱们只有在配置文件中 指定咱们的数据源的类型为 Druid就能够切换到 Druid:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    # 指定类型为咱们本人的
    type: com.alibaba.druid.pool.DruidDataSource
  • 测试,打印出数据源
 @Test
public void load(){System.out.println(dataSource.getClass());
}

能够看到:

这就阐明咱们援用胜利了!

配置文件

这是残缺的配置文件,因为不是应用 starter,所以属性不会主动拆卸,须要咱们写配置类。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

    #Spring Boot 默认是不注入这些属性值的,须要本人绑定
    #druid 数据源专有配置
    # 初始化大小,最小,最大
    initialSize: 5
    minIdle: 5
    maxActive: 200
    # 配置获取连贯期待超时的工夫
    maxWait: 60000
    # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连贯在池中最小生存的工夫,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 用来检测连贯是否无效的 sql,要求是一个查问语句
    validationQuery: SELECT 1 FROM DUAL
    # 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。testWhileIdle: true
    # 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能
    testOnBorrow: false
    # 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。testOnReturn: false
    # 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。poolPreparedStatements: true
    # 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。max-pool-prepared-statement-per-connection-size: 50

    #配置监控统计拦挡的 filters,stat: 监控统计、log4j:日志记录、wall:进攻 sql 注入
    #如果容许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    # 合并多个 DruidDataSource 的监控数据
    useGlobalDataSourceStat: true
    # 通过 connectProperties 属性来关上 mergeSql 性能;慢 SQL 记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  • 配置类

@Configuration
public class DruidConfig {

    /*
       将自定义的 Druid 数据源增加到容器中,不再让 Spring Boot 主动创立
       绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource 从而让它们失效
       @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
       前缀为 spring.datasource 的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
     */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {return new DruidDataSource();
    }

}
  • 测试

咱们通过获取数据源的属性来判断刚刚的设置是否失效

    @Test
    public void contextLoads() throws SQLException {
        // 看一下默认数据源
        System.out.println(dataSource.getClass());
        // 取得连贯
        Connection connection =   dataSource.getConnection();
        System.out.println(connection);

        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
        System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
        System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());

        // 敞开连贯
        connection.close();}

能够看到,咱们设置的属性曾经配置进去了:

应用 starter 启动器

Druid 官网已提供启动器了,咱们只有应用启动器,就能实现 springboot 的主动拆卸,就不须要再通过配置类去注入咱们的 bean 了。

官网 starter 教程

  • 增加依赖
<!--Druid starter-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.22</version>
</dependency>
  • 增加配置

druid 中默认的配置都是以 spring.datasource.druid.* 结尾的,所以咱们只有在配置文件中配置属性就好就好,不须要再写配置类去绑定配置信息:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
    
    druid:
    #druid 数据源专有配置
    # 初始化大小,最小,最大
      initialSize: 5
      minIdle: 5
      maxActive: 200
      # 配置获取连贯期待超时的工夫
      maxWait: 60000
      # 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连贯在池中最小生存的工夫,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 用来检测连贯是否无效的 sql,要求是一个查问语句
      validationQuery: SELECT 1 FROM DUAL
      # 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。testWhileIdle: true
      # 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能
      testOnBorrow: false
      # 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。testOnReturn: false
      # 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。poolPreparedStatements: true
      # 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。max-pool-prepared-statement-per-connection-size: 50
  
      #配置监控统计拦挡的 filters,stat: 监控统计、log4j:日志记录、wall:进攻 sql 注入
      #如果容许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
      #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
      # 配置监控统计拦挡的 filters,去掉后监控界面 sql 无奈统计,比方不配置 stat, 咱们在 Druid 的监控页面中就拿不到想要的信息。filters: stat,wall,log4j
      # 合并多个 DruidDataSource 的监控数据
      useGlobalDataSourceStat: true
      # 通过 connectProperties 属性来关上 mergeSql 性能;慢 SQL 记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

这样咱们刚刚的 DruidConfig 就能够不要了,再次启动测试类,发现也是失常读取到咱们的自定义配置:

这个时候咱们拜访localhost:8080/druid,就能够进入 druid 默认的监控控制台。

配置多数据源

参考官网文档即可

配置 Druid 监控

Druid 数据源具备监控的性能,并提供了一个 web 界面不便用户查看,相似装置 路由器 时,人家也提供了一个默认的 web 页面。然而这个页面默认是所有人都能够拜访,不平安,所以个别咱们都要定制的去设置。

对于 Spring Boot 有两种配置形式,一种是基于配置类,一种是间接在配置文件中配置。

间接在配置文件中配置

比方间接在配置文件中配置如下,其余的配置也雷同,能够看官网:

# WebStatFilter 配置,阐明请参考 Druid Wiki,配置_配置 WebStatFilter
# 次要进行配置哪些申请须要 druid 监控,哪些不须要
spring.datasource.druid.web-stat-filter.enabled= #是否启用 StatFilter 默认值 false
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=

# StatViewServlet 配置,阐明请参考 Druid Wiki,配置_StatViewServlet 配置
spring.datasource.druid.stat-view-servlet.enabled= #是否启用 StatViewServlet 默认值 false
#申请门路
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
# 设置登录用户
spring.datasource.druid.stat-view-servlet.login-username=
# 设置登录明码
spring.datasource.druid.stat-view-servlet.login-password=
# 容许哪些 ip 拜访
spring.datasource.druid.stat-view-servlet.allow=
#禁止哪些 ip 拜访
spring.datasource.druid.stat-view-servlet.deny=

# Spring 监控配置,阐明请参考 Druid Github Wiki,配置_Druid 和 Spring 关联监控配置
spring.datasource.druid.aop-patterns= # Spring 监控 AOP 切入点,如 x.y.z.service.*, 配置多个英文逗号分隔
# 如果 spring.datasource.druid.aop-patterns 要代理的类没有定义 interface 请设置 spring.aop.proxy-target-class=true

通过配置类配置

@Configuration
public class MyConfig {


    // 配置 Druid 监控治理后盾的 Servlet;// 内置 Servlet 容器时没有 web.xml 文件,所以应用 Spring Boot 的注册 Servlet 形式
    @Bean
    public ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");

        // 这些参数能够在 com.alibaba.druid.support.http.StatViewServlet
        // 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin"); // 后盾治理界面的登录账号
        initParams.put("loginPassword", "123456"); // 后盾治理界面的登录明码

        // 后盾容许谁能够拜访
        //initParams.put("allow", "localhost"):示意只有本机能够拜访
        //initParams.put("allow", ""):为空或者为 null 时,示意容许所有拜访
        initParams.put("allow", "");
        //deny:Druid 后盾回绝谁拜访
        //initParams.put("deny", "192.168.1.20"); 示意禁止此 ip 拜访

        // 设置初始化参数
        bean.setInitParameters(initParams);
        return bean;
    }


    // 配置 Druid 监控 之  web 监控的 filter
//WebStatFilter:用于配置 Web 和 Druid 数据源之间的治理关联监控统计
    @Bean
    public FilterRegistrationBean webStatFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        //exclusions:设置哪些申请进行过滤排除掉,从而不进行统计
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
        bean.setInitParameters(initParams);

        //"/*" 示意过滤所有申请
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}

其实能够看到,两者的配置是一样的。

如何配置 Filter

你能够通过 spring.datasource.druid.filters=stat,wall,log4j ... 的形式来启用相应的内置 Filter,不过这些 Filter 都是默认配置。如果默认配置不能满足你的需要,你能够放弃这种形式,通过配置文件来配置 Filter,上面是例子。

# 配置 StatFilter 
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# 配置 WallFilter 
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false

# 其余 Filter 配置不再演示

目前为以下 Filter 提供了配置反对,请参考文档或者依据 IDE 提醒(spring.datasource.druid.filter.*)进行配置。

  • StatFilter
  • WallFilter
  • ConfigFilter
  • EncodingConvertFilter
  • Slf4jLogFilter
  • Log4jFilter
  • Log4j2Filter
  • CommonsLogFilter

要想使自定义 Filter 配置失效须要将对应 Filter 的 enabled 设置为 true,Druid Spring Boot Starter 默认禁用 StatFilter,你也能够将其 enabled 设置为 true 来启用它

参考

官网文档

参考

退出移动版