• SpringBoot系列之集成Druid配置数据源监控


    SpringBoot系列之集成Druid配置数据源监控

    继上一篇博客SpringBoot系列之JDBC数据访问之后,本博客再介绍数据库连接池框架Druid的使用

    实验环境准备:

    • Maven
    • IntelliJ IDEA

    先新建一个Springboot Initializer项目,详情参考SpringBoot系列之快速创建Initializer项目,注意引入必须的JDBC,web依赖等等,因为Druid默认没提供,所以去https://mvnrepository.com/artifact/com.alibaba/druid获取配置信息,项目创建之后,pom配置应该有如下:

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<version>5.1.27</version>
    			<scope>runtime</scope>
    		</dependency>
    
    		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>druid</artifactId>
    			<version>1.1.2</version>
    		</dependency>
    

    新增一个application.yml配置文件,加上如下配置:type: com.alibaba.druid.pool.DruidDataSource必须指定

    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        initialization-mode: always
        type: com.alibaba.druid.pool.DruidDataSource
    
        # 连接池设置
        initial-size: 5
        min-idle: 5
        max-active: 20
        # 配置获取连接等待超时的时间
        max-wait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        time-between-eviction-runs-millis: 90000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        min-evictable-idle-time-millis: 300000
        # Oracle请使用select 1 from dual
        validation-query: SELECT 1
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        use-global-data-source-stat: true
    
    

    写一个junit测试类进行测试:

    package com.example.springboot.jdbc;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    @SpringBootTest
    class SppringbootJdbcApplicationTests {
    
    	@Autowired
    	DataSource dataSource;
    
    	@Test
    	public void contextLoads() throws SQLException {
    		System.out.println(dataSource.getClass());
    		Connection connection = dataSource.getConnection();
    		System.out.println(connection);
    		connection.close();
    	}
    
    }
    

    经过调试,属性都没起效,原因是Springboot的自动配置类并没有如下属性的,所以在idea里都标识显示如下颜色:
    在这里插入图片描述
    所以要让这些配置起效,需要写个配置类,通过ConfigurationProperties进行属性映射

    @Configuration
    public class DriudConfig {
    
        @Primary
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource")
        public DataSource dataSource(){
            return new DruidDataSource();
        }
    }
    

    再次启动junit调试,发现属性都起效了,ok,测试通过
    在这里插入图片描述
    Druid提供了一个针对数据源等等进行监控的平台,所以需要配置才能正常使用

    package com.example.springboot.jdbc.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    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.context.annotation.Primary;
    
    import javax.sql.DataSource;
    
    /**
     * <pre>
     *  Druid配置类
     * </pre>
     *
     * @author nicky
     * <pre>
     * 修改记录
     *    修改后版本:     修改人:  修改日期: 2019年12月15日  修改内容:
     * </pre>
     */
    @Configuration
    public class DriudConfig {
    
        @Primary
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource")
        public DataSource dataSource(){
            return new DruidDataSource();
        }
    
        /**
         * 注册ServletRegistrationBean
         * @return
         */
        @Bean
        public ServletRegistrationBean registrationBean() {
            ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
            /** 初始化参数配置,initParams**/
            //白名单
            bean.addInitParameter("allow", "127.0.0.1");
            //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
            bean.addInitParameter("deny", "192.168.1.73");
            //登录查看信息的账号密码.
            bean.addInitParameter("loginUsername", "admin");
            bean.addInitParameter("loginPassword", "admin");
            //是否能够重置数据.
            bean.addInitParameter("resetEnable", "false");
            return bean;
        }
    
        /**
         * 注册FilterRegistrationBean
         * @return
         */
        @Bean
        public FilterRegistrationBean druidStatFilter() {
            FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
            //添加过滤规则.
            bean.addUrlPatterns("/*");
            //添加不需要忽略的格式信息.
            bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return bean;
        }
    }
    
    

    ok,访问http://127.0.0.1:8080/ ,输入代码里配置的账号密码就可以登录进行访问,我设置的账号密码都是admin,输入账号密码登录平台,查询数据源,sql监控等等功能
    在这里插入图片描述

    代码例子下载:github下载链接

  • 相关阅读:
    Socket编程模式
    Asp.Net Core
    TensorFlow文本与序列的深度模型
    Net
    XSS分析及预防(转)
    MyCAT部署及实现读写分离(转)
    如何搭建NTP服务(转)
    如何搭建DNS服务(转)
    如何高效地向Redis插入大量的数据(转)
    Android 通过广播启动另一个应用的Activity
  • 原文地址:https://www.cnblogs.com/mzq123/p/12043753.html
Copyright © 2020-2023  润新知