springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源

druid数据源

Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能

自定义配置druid数据源

1.引入依赖

首先,在pom.xml中,添加druid的依赖,jdbc的stater,以及mysql驱动:

        <!--  jdbc stater      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!--   druid数据源     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

2.配置自定义dataSoruce的Bean组件

默认情况下,springboot会使用Hikari数据源,默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)。

使用@Configuration标识这个类是一个配置类

package com.robin.boot.config;

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


import javax.sql.DataSource;

@Configuration
public class MyDataSourceConfig {
    
    


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource(){
    
    
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,数据库的账户密码,url,以及jdbc驱动
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return druidDataSource;
    }
}

3.测试sql,验证数据源是否配置成功

在当前springboot项目中的测试类中,进行测试,使用原生的jdbcTemplate去测试,并且使用slf4j日志来查看输出信息。

package com.robin.boot;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Slf4j
@SpringBootTest
class DemoReSqlApplicationTests {
    
    

    @Autowired 
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() {
    
    
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        log.info("记录数为{}",aLong);
        log.info("数据源{}",dataSource.getClass());
    }

}

ok,数据源配置成功…
在这里插入图片描述

4.开启 StatFilter,wallFilter,lg4j以及内置监控信息页面

Druid内置提供一个StatFilter,wallfilter,用于统计监控信息及sql防火墙。也可以使用日志记录信息log4j。

查看druid官方文档,其提供的xml配置如下:

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  	... ...
  	<property name="filters" value="stat,wall,log4j" />
  </bean>

dataSource对应的bean组件,我们已经在上面创建过了,所以开启统计信息只需要在bean组件中,添加属性即可
// 开启stat sql监控信息 druidDataSource.setFilters("stat,wall,log4j");

开启druid内置监控页面,Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
其官网提供的xml配置如下:

<!-- 配置 Druid 监控信息显示页面 -->  
<servlet>  
    <servlet-name>DruidStatView</servlet-name>  
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    <init-param>  
	<!-- 允许清空统计数据 -->  
	<param-name>resetEnable</param-name>  
	<param-value>true</param-value>  
    </init-param>  
    <init-param>  
	<!-- 用户名 -->  
	<param-name>loginUsername</param-name>  
	<param-value>druid</param-value>  
    </init-param>  
    <init-param>  
	<!-- 密码 -->  
	<param-name>loginPassword</param-name>  
	<param-value>druid</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>DruidStatView</servlet-name>  
    <url-pattern>/druid/*</url-pattern>  
</servlet-mapping>  

自定义Servlet来使用druid的内置监控页面:

使用 ServletRegistrationBean 类来创建一个自定义的servlet,且其名字为statViewServlet

 	@Bean
    public ServletRegistrationBean statViewServlet(){
    
    
        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }

运行访问localhost:8080/druid,自动跳转到druid监控页面的登录页,输入刚刚自定义的账号密码,登入查看:

在这里插入图片描述
在这里插入图片描述

此时我们的druid内置监控页面已经开启啦~~

5.开启Web关联监控配置

其官网提供的xml配置如下:

  <filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

就是一个名为DruidWebStatFilter的拦截器,类型为com.alibaba.druid.support.http.WebStatFilter。

使用 FilterRegistrationBean 创建一个自定义的filter,且其名为webStatFilter。

	@Bean
    public FilterRegistrationBean webStatFilter(){
    
    
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }

6.开启Spring关联监控配置

Druid提供了Spring和Jdbc的关联监控。有两种方式,按类型拦截配置和方法名正则匹配拦截配置。

 	<!-- 1.按类型拦截配置-->
   <bean id="druid-stat-interceptor"
  	class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>
  
  <bean id="druid-type-proxyCreator" class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
  	<!-- 所有ABCInterface的派生类被拦截监控  -->
  	<property name="targetBeanType" value="xxxx.ABCInterface" />
  	<property name="interceptorNames">
  		<list>
  			<value>druid-stat-interceptor</value>
  		</list>
  	</property>
  </bean>
    <bean id="druid-stat-interceptor"
  	class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<!--2.方法名正则匹配拦截配置 -->
  <bean id="druid-stat-interceptor"
  	class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
	scope="prototype">
	<property name="patterns">
		<list>
			<value>com.mycompany.service.*</value>
			<value>com.mycompany.dao.*</value>
		</list>
	</property>
</bean>

<aop:config>
	<aop:advisor advice-ref="druid-stat-interceptor"
		pointcut-ref="druid-stat-pointcut" />
</aop:config>

7.编写controller,测试sql是否会被监控页面看到

使用原生的jdbctemplate,将sql进行查询,然后通过@GetMapping(“/sql”),映射请求。

package com.robin.boot.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;

@Controller
public class SqlTestController {
    
    
    
    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/sql")
    public String querySql(){
    
    
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        return aLong.toString();
    }

}

8.统一测试,查看监控页面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

除了spring监控(没有配置),其余都正确监控了

9.完整的自定义配置druid数据源,和项目结构

完整的自定义配置druid数据源:

package com.robin.boot.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.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.sql.SQLException;
import java.util.Arrays;


@Configuration
public class MyDataSourceConfig {
    
    


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
	@Bean
    public DataSource dataSource() throws SQLException {
    
    
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        // 开启stat sql监控信息
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }


    // 配置druid的监控页
    @Bean
    public ServletRegistrationBean statViewServlet(){
    
    

        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }


    // 配置WebStatFilter
    @Bean
    public FilterRegistrationBean webStatFilter(){
    
    
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }
}


项目结构:
在这里插入图片描述


导入stater配置druid数据源(推荐-简单方便使用)

使用第三方提供的stater配置数据源,相比自定义配置使用很简单

1.引入依赖

		<!-- jdbc stater-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
		<!-- druid stater-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2.编写application.yaml

首先将上面自定义的注释掉,使用stater的方式配置druid数据源,只需要引入依赖,然后修改application.yaml的配置信息即可,很方便。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/phpdemo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      aop-patterns: com.robin.boot # 监控SpringBean
      filters: stat,wall # 开启sql监控和防火墙功能

      stat-view-servlet: #配置监控页功能
        enabled: true
        login-username: admin
        login-password: robin
        reset-enable: false # 禁用刷新重置按钮

      web-stat-filter: # 监控web
        enabled: true
        url-pattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

启动服务,用上面的controller进行测试,可以正确访问。


猜你喜欢

转载自blog.csdn.net/m0_63622279/article/details/128775329
今日推荐