• SpringBoot数据访问之Druid数据源的自定义使用


    数据访问之Druid数据源的使用

    说明:该数据源Druid,使用自定义方式实现,后面文章使用start启动器实现,学习思路为主。

    为什么要使用数据源:

    ​ 数据源是提高数据库连接性能的常规手段,数据源会负责维持一个数据连接池,当程序创建数据源实例时,系统会一次性地创建多个数据库连接,并把这些数据库连接保存在连接池中。

    ​ 当程序需要进行数据库访问时,无须重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。

    ​ 当程序使用数据库连接访问数据库结束后,无须关闭数据库连接,而是将数据库连接归还给连接池即可。

    ​ 通过这种方式,就可避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降

    ​ ---引自

    Druid官方github地址

    Druid中文文档

    Druid的介绍以及优点:

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它不但结合了C3P0、DBCP、PROXOOL等数据库连接池的优点,同时还加入了日志监控,可以分别监控DB池连接和SQL的执行情 况,是一款针对监控而生的数据库连接池

    整合第三方技术的两种方式

    • 自定义
    • 找starter

    自定义实现Druid数据源

    引入数据源

    博主版本:1.2.6

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>版本号</version>
    </dependency>
    

    配置数据源

    因为在引入数据源,SpringBoot默配置的数据源是HikariDataSource,所以我们如果要使用Druid的话,需要自己创建一个数据源,并放到容器中使用,myDataSourceConfig文件代码如下:

    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 MyDtaSourceConfig {
        @Bean
        public DataSource dataSource() {
    
            return new DruidDataSource();   //创建Druid数据源
        }
    }
    

    为什么我们创建的数据源可以使用呢?

    在DataSourceAutoConfiguration中的以下部分可以发现:

    @Configuration(proxyBeanMethods = false)
    	@Conditional(PooledDataSourceCondition.class)
    	@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    	@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
    			DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
    			DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
    	protected static class PooledDataSourceConfiguration {
    
    	}
    

    有引入DataSourceConfiguration.Hikari.class这个默认类,点击进入,

    @Configuration(proxyBeanMethods = false)
    	@ConditionalOnClass(HikariDataSource.class)
    	@ConditionalOnMissingBean(DataSource.class)
    	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
    			matchIfMissing = true)
    	static class Hikari {
    
    		@Bean
    		@ConfigurationProperties(prefix = "spring.datasource.hikari")  
    		HikariDataSource dataSource(DataSourceProperties properties) {
    			HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
    			if (StringUtils.hasText(properties.getName())) {
    				dataSource.setPoolName(properties.getName());
    			}
    			return dataSource;
    		}
    
    	}
    

    由上述代码可以发现,默认的配置源是HikariDataSource,但是有一个要求:

    @ConditionalOnMissingBean(DataSource.class)

    就是如果在容器中没有数据源,下面代码生效,也就是使用HikariDataSource,但是若容器中已经有开发者创建的数据源,那么开发者创建的优先。

    在使用数据源的时候,不可避免地需要配置基本的属性,如:url、用户名、密码、端口号等。所以我们可以将这些信息抽取出来,放到配置文件中,

    这里我们采用yaml写法application.yaml:

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/vuesite
        username: root
        password: 123456
        driver-class-name: com.mysql.jdbc.Driver
    

    使用ConfigurationProperties注解来进行属性的绑定:

    package com.xbhog.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 MyDtaSourceConfig {
        @ConfigurationProperties("spring.datasource")  //属性绑定 要加对位置
        @Bean
        public DataSource dataSource() {
            DruidDataSource druidDataSource = new DruidDataSource();
    
            return druidDataSource;
        }
    }
    

    进行单元测试:

    package com.xbhog;
    
    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;
    
    @SpringBootTest
    @Slf4j
    class FirstAdminApplicationTests {
        @Autowired
        DataSource dataSource;
        
        @Test
        void contextLoads() {
            log.info("数据类型:{}",dataSource.getClass());
        }
    }
    

    结果==> 数据类型:class com.alibaba.druid.pool.DruidDataSource

    具体的配置绑定:个人博客

    Druid中的其他功能

    配置监控页:

    贴心文档链接:网页地址

    image-20210805205430910

    我们需要配置一个servlet配置,然后放到容器中,输入账号密码,进入链接地址即可访问;

    在配置数据源代码下:

    /**
    * 配置监控页
    */
    @Bean
    public ServletRegistrationBean staViewServlet(){
        //实例化StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
    	 //将实例化的实例化StatViewServlet 传入ServletRegistrationBean,并设置访问路径
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
    
        return registrationBean;
    }
    

    结果:

    image-20210805220243375

    开启登录功能:

    因为登录设置还是在servlet中设置的,所以相关信息暂略,贴一个文档截图:

    image-20210805225736517

    代码添加:

    @Bean
    public ServletRegistrationBean staViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
    
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        //配置登录信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","123456");
        return registrationBean;
    }
    

    结果:

    image-20210805230312915

    打开监控统计功能:

    测试Sql监控功能。

    网页地址:

    image-20210805220855138

    创建一个DruidDataSource组件,并配置其中的属性filters的value为stat,这样才能打开监控功能。

    所以我们在创建数据源的地方需要配置filters属性:

    public class MyDtaSourceConfig {
        @ConfigurationProperties("spring.datasource")
        @Bean
        public DataSource dataSource() throws SQLException {
            DruidDataSource druidDataSource = new DruidDataSource();
            //加入监控功能
            druidDataSource.setFilters("stat");
            return druidDataSource;
        }
    }
    

    也可以进行属性的配置来实现上述的效果:(第二种方法)

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/vuesite
        username: root
        password: 123456
        driver-class-name: com.mysql.jdbc.Driver
    
        filters: stat
        tomcat:
          max-active: 12
    

    然后设置一个请求,来测试监控功能;

    创建一个controller:

    @Controller
    public class tablecontro {
    
      	  @Autowired
        JdbcTemplate jdbcTemplate;
    
        @ResponseBody   //不经过视图解析器
        @GetMapping("/sql")
        public String druidquery(){
            Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class);
            return aLong.toString();
        }
    }
    

    先访问localhost:8080/sql,然后进入http://localhost:8080/druid/index.html页面中的SQL监控,即可查看执行次数次数。

    image-20210805222307034

    在最大并发的后面的有各种分布,可以参考官方文档:Druid连接池介绍

    开启Web应用功能:

    基本上还是跟上面一样的;

    WebStatFilter用于采集web-jdbc关联监控的数据。

    网页地址

    image-20210805223449196

    配置一个WebStatFilter,然后需要初始化exclusions,来排除一些不必要的url.得先进行sql的请求

    /**
         * WebStatFilter用于采集web-jdbc关联监控的数据。
         */
    @Bean
    public FilterRegistrationBean webRegistrationBean(){
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        //添加一些不必要的ulr,在初始化的时候就执行
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return  registrationBean;
    }
    

    结果:

    Web应用:

    image-20210805224340471

    URL监控

    image-20210805224412002

    配置防火墙:

    wallfilter

    image-20210805224916468

    所以我们可以结合Filter一起使用,代码如下:得先进行sql的请求。

    public class MyDtaSourceConfig {
        @ConfigurationProperties("spring.datasource")
        @Bean
        public DataSource dataSource() throws SQLException {
            DruidDataSource druidDataSource = new DruidDataSource();
            //加入监控功能
            druidDataSource.setFilters("stat,wall");
            return druidDataSource;
        }
    }
    

    结果:

    image-20210805225035364

    参考文献

    Druid官方github地址

    Druid中文文档

    引用

    SpringBoot2零基础入门springboot全套完整版

    结束:

    如果你看到这里或者正好对你有所帮助,希望能点个关注或者推荐,感谢;

    有错误的地方,欢迎在评论指出,作者看到会进行修改。

  • 相关阅读:
    TCP/IP——IP网络协议简记
    TCP/IP——基础概念简记
    TCP/IP——链路层简记
    linux——(8)数据流重定向、管道命令
    linux——(7)了解shell
    linux——(6)vim与vi
    linux——(5)文件与文件系统的压缩与打包
    linux——(4)磁盘与文件系统管理
    linux——(3)文件与目录管理
    大数据--Spark原理
  • 原文地址:https://www.cnblogs.com/xbhog/p/15108549.html
Copyright © 2020-2023  润新知