SpringBoot整合Druid

  • 2019 年 10 月 16 日
  • 笔记

最近一直在折腾springboot,也根据需要整合了一些好用的库,mybatis作为持续层数据操作,也想用一下大名鼎鼎的Druid来做连接池和数据库监控服务。于是摸索了一下午,整理出这篇小文,希望能帮助到同道,也给自己做个记录反思。

  • 1.关于Druid

Druid是阿里团队开源的高性能数据库连接池,国内使用广泛,特别是在监控sql和数据库性能方面非常强大。

连接池能有效节省数据库连接消耗,且对高写入、实时性要求高的业务非常合适。

  • 2.引入依赖到pom.xml中。
<dependency>     <groupId>com.alibaba</groupId>     <artifactId>druid-spring-boot-starter</artifactId>     <version>1.1.10</version>  </dependency>  
  • 3.然后在application.yml中设置相关配置
spring:    datasource:      url: jdbc:mysql://127.0.0.1:3306/test_go?characterEncoding=UTF-8&useSSL=false      username: xxx      password: xxxxxx      driver-class-name: com.mysql.jdbc.Driver      type: com.alibaba.druid.pool.DruidDataSource      druid:        initial-size: 5        min-idle: 5        max-active: 20        test-while-idle: true        test-on-borrow: false        test-on-return: false        pool-prepared-statements: true        max-pool-prepared-statement-per-connection-size: 20        max-wait: 60000        time-between-eviction-runs-millis: 60000        min-evictable-idle-time-millis: 30000        filters: stat        async-init: true

其中最重要的是

type: com.alibaba.druid.pool.DruidDataSource

这样就不会使用Springboot默认的连接池Hikari。

由于SpringBoot没法生效写在yml文件中的配置,需要单独编写Bean文件来加载。

  • 4.定义Druid配置类。
package com.tony.testspringboot.config;      import com.alibaba.druid.pool.DruidDataSource;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.beans.factory.annotation.Value;  import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.Configuration;  import org.springframework.context.annotation.Primary;    import javax.sql.DataSource;  import java.sql.SQLException;    @Configuration  public class DruidConfig {      private Logger logger = LoggerFactory.getLogger(DruidConfig.class);        @Value("${spring.datasource.url}")      private String dbUrl;        @Value("${spring.datasource.username}")      private String username;        @Value("${spring.datasource.password}")      private String password;      @Value("${spring.datasource.test-druid.driver-class-name}")      private String driverClassName;        @Value("${spring.datasource.druid.initial-size}")      private int initialSize;        @Value("${spring.datasource.druid.min-idle}")      private int minIdle;        @Value("${spring.datasource.druid.max-active}")      private int maxActive;        @Value("${spring.datasource.druid.max-wait}")      private int maxWait;        @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")      private int timeBetweenEvictionRunsMillis;        @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")      private int minEvictableIdleTimeMillis;        @Value("${spring.datasource.druid.test-while-idle}")      private boolean testWhileIdle;        @Value("${spring.datasource.druid.test-on-borrow}")      private boolean testOnBorrow;        @Value("${spring.datasource.druid.test-on-return}")      private boolean testOnReturn;        @Value("${spring.datasource.druid.pool-prepared-statements}")      private boolean poolPreparedStatements;        @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")      private int maxPoolPreparedStatementPerConnectionSize;        @Value("${spring.datasource.druid.filters}")      private String filters;        @Bean      @Primary      public DataSource dataSource() {          DruidDataSource datasource = new DruidDataSource();            datasource.setUrl(this.dbUrl);          datasource.setUsername(this.username);          datasource.setPassword(this.password);          datasource.setDriverClassName(this.driverClassName);            // configuration          datasource.setInitialSize(this.initialSize);          datasource.setMinIdle(this.minIdle);          datasource.setMaxActive(this.maxActive);          datasource.setMaxWait(this.maxWait);          datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);          datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);          datasource.setTestWhileIdle(this.testWhileIdle);          datasource.setTestOnBorrow(this.testOnBorrow);          datasource.setTestOnReturn(this.testOnReturn);          datasource.setPoolPreparedStatements(this.poolPreparedStatements);          datasource.setMaxPoolPreparedStatementPerConnectionSize(this.maxPoolPreparedStatementPerConnectionSize);            try {              datasource.setFilters(this.filters);          } catch (SQLException e) {              logger.error("druid configuration init fail!");          }            return datasource;      }  }  

如此即可让配置的参数生效并作为首选的DataSource进行使用。

5.在Controller中测试。

可以使用JdbcTemplate来进行查询。
测试代码如下所示:

@RequestMapping(value = "/hey", method = RequestMethod.GET)  public ResultResponse testDruid() {        String sql = "SELECT mobile FROM user WHERE id = ?";        String mobile = jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class);        return new ResultResponse(201, "hey" + mobile);  }  

PS: ResultResponse是我项目中封装的通用response对象。

关于多数据源参数的设置。

只需要在yml(application.yml)中设置即可,格式如下:

datasource:      one-source:        url: jdbc:mysql://127.0.0.1:3306/test_go?characterEncoding=UTF-8&useSSL=false        username: xxxx1        password: xxxx        driver-class-name: com.mysql.jdbc.Driver        type: com.alibaba.druid.pool.DruidDataSource      two-source:        url: jdbc:mysql://127.0.0.1:3306/demo2?characterEncoding=UTF-8&useSSL=false        username: xxxx        password: 1xxxxxx        driver-class-name: com.mysql.jdbc.Driver        type: com.alibaba.druid.pool.DruidDataSource      ...

使用的时候也遵循这个结构,如要获取第一个数据源的url配置则在DruidConfig.java文件中的相应项的@Value中这样写:

@Value("${spring.datasource.one-source.url}")  private String dbUrl;
  • 6.配置数据库监控。

a) 先在application.yml中增加如下配置:

druid:     .....     # 通过connectProperties属性来打开mergeSql功能;慢SQL记录     connection-properties: druid.stat.mergeSql=true;druid.stat.SlowSqlMills=5000     # 监控后台的配置,如登录账号和密码等     monitor:       allow: 127.0.0.1       loginUsername: admin       loginPassword: admin

b)单独编写DruidMonitorConfiguration类。

public class DruidMonitorConfiguration {        @Value("${spring.datasource.druid.monitor.allow}")      private String allow;  //    @Value("${spring.datasource.druid.monitor.deny}")  //    private String deny;      @Value("${spring.datasource.druid.monitor.loginUsername}")      private String loginUsername;      @Value("${spring.datasource.druid.monitor.loginPassword}")      private String loginPassword;      @Value("${spring.datasource.druid.monitor.resetEnable")      private String resetEnable;      @Bean      public ServletRegistrationBean druidStatViewServlet() {          ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");          servletRegistrationBean.addInitParameter("allow", this.allow);  //        servletRegistrationBean.addInitParameter("deny", this.deny);          servletRegistrationBean.addInitParameter("loginUsername", this.loginUsername);          servletRegistrationBean.addInitParameter("loginPassword", this.loginPassword);          servletRegistrationBean.addInitParameter("resetEnable", this.resetEnable);          return servletRegistrationBean;      }        @Bean      public FilterRegistrationBean druidStatFilter() {          FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());          filterRegistrationBean.addUrlPatterns("/*");          filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");          return filterRegistrationBean;      }    }  

访问方法就是:http://project-name.com/druid/login.html

验证登录即可。整个监控功能十分强大,有sql监控、URI监控、Session监控,Web应用等等。