SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面相关的知识,希望对你有一定的参考价值。

一、Druid连接池

1、druid简介

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
Druid连接池是阿里巴巴内部唯一使用的连接池,在内部数据库相关中间件TDDL/DRDS 都内置使用强依赖了Druid连接池,经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证。

2、druid特点

1)稳定性特性,阿里巴巴的业务验证
2)完备的监控信息,快速诊断系统的瓶颈
3)内置了WallFilter 提供防SQL注入功能

二、整合SpringBoot2.0框架

1、引入核心依赖

<!-- 数据库依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.13</version>
</dependency>
<!-- JDBC 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2、数据源配置文件

spring:
  application:
    # 应用名称
    name: node07-boot-druid
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/data_one?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false
      username: root
      password: 123
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      max-evictable-idle-time-millis: 60000
      validation-query: SELECT 1 FROM DUAL
      # validation-query-timeout: 5000
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      #filters: #配置多个英文逗号分隔(统计,sql注入,log4j过滤)
      filters: stat,wall
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*

3、核心配置类

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Druid数据库连接池配置文件
 */
@Configuration
public class DruidConfig 
    private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class);
    @Value("$spring.datasource.druid.url")
    private String dbUrl;
    @Value("$spring.datasource.druid.username")
    private String username;
    @Value("$spring.datasource.druid.password")
    private String password;
    @Value("$spring.datasource.druid.driverClassName")
    private String driverClassName;
    @Value("$spring.datasource.druid.initial-size")
    private int initialSize;
    @Value("$spring.datasource.druid.max-active")
    private int maxActive;
    @Value("$spring.datasource.druid.min-idle")
    private int minIdle;
    @Value("$spring.datasource.druid.max-wait")
    private int maxWait;
    @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.time-between-eviction-runs-millis")
    private int timeBetweenEvictionRunsMillis;
    @Value("$spring.datasource.druid.min-evictable-idle-time-millis")
    private int minEvictableIdleTimeMillis;
    @Value("$spring.datasource.druid.max-evictable-idle-time-millis")
    private int maxEvictableIdleTimeMillis;
    @Value("$spring.datasource.druid.validation-query")
    private String validationQuery;
    @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.filters")
    private String filters;
    @Value("spring.datasource.druid.connection-properties")
    private String connectionProperties;
    /**
     * Druid 连接池配置
     */
    @Bean     //声明其为Bean实例
    public DruidDataSource dataSource() 
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setMaxEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try 
            datasource.setFilters(filters);
         catch (Exception e) 
            logger.error("druid configuration initialization filter", e);
        
        datasource.setConnectionProperties(connectionProperties);
        return datasource;
    
    /**
     * JDBC操作配置
     */
    @Bean(name = "dataOneTemplate")
    public JdbcTemplate jdbcTemplate (@Autowired DruidDataSource dataSource)
        return new JdbcTemplate(dataSource) ;
    

    /**
     * 配置 Druid 监控界面
     */
    @Bean
    public ServletRegistrationBean statViewServlet()
        ServletRegistrationBean srb =
                new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        //设置控制台管理用户
        srb.addInitParameter("loginUsername","root");
        srb.addInitParameter("loginPassword","root");
        //是否可以重置数据
        srb.addInitParameter("resetEnable","false");
        return srb;
    
    @Bean
    public FilterRegistrationBean statFilter()
        //创建过滤器
        FilterRegistrationBean frb =
                new FilterRegistrationBean(new WebStatFilter());
        //设置过滤器过滤路径
        frb.addUrlPatterns("/*");
        //忽略过滤的形式
        frb.addInitParameter("exclusions",
                "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return frb;
    

4、简单测试类

@RestController
public class DruidController 
    private static final Logger LOG = LoggerFactory.getLogger(DruidController.class);
    @Resource
    private JdbcTemplate jdbcTemplate ;
    @RequestMapping("/druidData")
    public String druidData ()
        String sql = "SELECT COUNT(1) FROM d_phone" ;
        Integer countOne = jdbcTemplate.queryForObject(sql,Integer.class) ;
        // countOne==2
        LOG.info("countOne=="+countOne);
        return "success" ;
    

三、测试效果

完成一次数据请求后,访问如下链接。
技术图片

http://localhost:8007/druid
输入配置的用户名和密码:
root root

1、Druid监控首页

主要展示链接数据库的基础信息。
技术图片

2、Druid监控数据源

连接池配置的各项详细属性,可以参考这里查看,无需再从网上查找。
技术图片

3、Druid监控SQL执行

所有执行的SQL,都会在这里被监控到,且会有SQL执行的详细计划。
技术图片

四、源代码

GitHub地址:知了一笑
https://github.com/cicadasmile
码云地址:知了一笑
https://gitee.com/cicadasmile

技术图片

以上是关于SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot2.0 基础案例(08):集成Redis数据库,实现缓存管理

SpringBoot2.0 基础案例(09):集成JPA持久层框架,简化数据库操作

SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置

SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存