纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

SpringBoot数据访问使用Druid数据源 SpringBoot数据访问自定义使用Druid数据源的方法

xbhog   2021-08-07 我要评论
想了解SpringBoot数据访问自定义使用Druid数据源的方法的相关内容吗xbhog在本文为您仔细讲解SpringBoot数据访问使用Druid数据源的相关知识和一些Code实例欢迎阅读和指正我们先划重点:SpringBoot数据访问Druid数据源,SpringBoot数据访问下面大家一起来学习吧

数据访问之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中的其他功能

配置监控页:

贴心文档链接:网页地址

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

在配置数据源代码下:

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

    return registrationBean;
}

结果:

开启登录功能:

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

代码添加:

@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;
}

结果:

打开监控统计功能:

测试Sql监控功能

网页地址:

创建一个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监控即可查看执行次数次数

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

开启Web应用功能:

基本上还是跟上面一样的

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

网页地址

配置一个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应用:

URL监控

配置防火墙:

wallfilter

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

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

结果:

参考文献

Druid官方github地址

Druid中文文档

引用

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

结束:

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

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


相关文章

猜您喜欢

  • C++内存池 C++手写内存池的案例详解

    想了解C++手写内存池的案例详解的相关内容吗HickeyZhang在本文为您仔细讲解C++内存池的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++内存池下面大家一起来学习吧..
  • Java擦除式泛型 Java的类型擦除式泛型详解

    想了解Java的类型擦除式泛型详解的相关内容吗南橘ryc在本文为您仔细讲解Java擦除式泛型的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java擦除式泛型,Java的类型擦除式泛型下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式