【整合】SpringBoot整合Druid&配置数据源监控

SpringBoot整合Druid&配置数据源监控

1. 数据访问简介

对于数据访问层,无论是 SQL 还是 NOSQLSpringBoot 默认采用整合 Spring Data 的方式进行统一的处理
添加大量自动配置,屏蔽了很多的设置。引入各种 xxxTemplatexxxRepository 来简化我们对数据访问层的操作。
对我们来说只需要进行简单的设置即可。

2. JDBC&自动配置原理

使用 Spring Initializr 模板创建一个新的 SpringBoot 工程
需要导入的模块中,勾选出 webmysqljdbc 模块
【整合】SpringBoot整合Druid&配置数据源监控_第1张图片
pom.xml 文件依赖如下



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.21.RELEASE
         
    
    com.jiker
    springboot-sql
    0.0.1-SNAPSHOT
    springboot-sql
    Demo project for Spring Boot

    
        11
    

    
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            mysql
            mysql-connector-java
            runtime
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


编写 application.yml 全局配置文件,配置数据源

spring:
  datasource:
    username: root
    password: xxxxxxxx
    url: jdbc:mysql://localhost:3306/test

效果:默认使用的是 org.apache.tomcat.jdbc.pool.DataSource 作为数据源
数据源的相关配置都是在 DataSourceProperties

测试如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootSqlApplicationTests {

    @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整合Druid&配置数据源监控_第2张图片

自动配置原理:
org.apache.tomcat.jdbc.pool.DataSource
1、参考 DataSourceConfiguration ,根据配置创建数据源,默认使用 Tomcat 连接池;
可以使用 spring.datasource.type 指定自定义的数据源类型
2、SpringBoot 默认可支持:

org.apache.tomcat.jdbc.pool.DataSource
HikariDataSource
BasicDataSource

3、自定义数据源类型

@Configuration
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
    name = {"spring.datasource.type"}
 )
static class Generic {
    Generic() {
    }

    @Bean
    public DataSource dataSource(DataSourceProperties properties) {
    	//使用 DataSourceBuilder 创建数据源,利用反射创建响应 type 的数据源,并且绑定相关属性
        return properties.initializeDataSourceBuilder().build();
    }
 }

4、DataSourceInitializer:ApplicationListener
作用:

  1. runSchemaScripts(); 运行建表语句
  2. runDataScripts(); 运行插入数据的 SQL 语句

默认只需将文件名命名为:

schema-*.sql、data-*.sql
默认规则:schema.sql ,schema-all.sql
可以使用:
	schema:
		- classpath:test.sql
		指定位置

5、操作数据库:自动配置了 jdbcTemplate 操作数据库
测试:

package com.jiker.springbootsql.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

@Controller
public class TestController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/query")
    public Map map(){
        List> list = jdbcTemplate.queryForList("select * from student");
        return list.get(1);
    }

}

启动服务,访问 /query 请求
【整合】SpringBoot整合Druid&配置数据源监控_第3张图片
数据成功得到

3. 整合Druid&配置数据源监控

导入 Druid 依赖


	 com.alibaba
     druid
     1.1.8

application.yml 配置文件中通过设置 spring.datasource.type 的值切换数据源

spring:
  datasource:
    username: root
    password: joker61919980819
    url: jdbc:mysql://localhost:3306/test
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

绑定属性

spring:
  datasource:
    username: root
    password: joker61919980819
    url: jdbc:mysql://localhost:3306/test
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    initiaSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictablIdleTimeMills: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

这些属性需要定义一个配置类进行属性赋值

package com.jiker.springbootsql.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }

}

配置 Druid 监控

package com.jiker.springbootsql.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 javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }

    //配置Druid监控
    //1.配置管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        Map initParams = new HashMap<>();

        initParams.put("loginUsernaem","admin");
        initParams.put("loginPassword","123456");
        initParams.put("allow","")//默认允许所有访问
        initParams.put("deny","192.168.15.21");

        bean.setInitParameters(initParams);
        return bean;
    }

    //2.配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParams);

        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }

}

访问 /druid 请求
【整合】SpringBoot整合Druid&配置数据源监控_第4张图片
访问 /query 请求查询数据库
查看 Druid 的 SQL监控
【整合】SpringBoot整合Druid&配置数据源监控_第5张图片
Druid 配置数据源监控成功

时间:2019.6.10 19:12

你可能感兴趣的:(java)