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

作者:xbhog 时间:2023-01-10 16:29:38 

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中的其他功能

配置监控页:

贴心文档链接:网页地址

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

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

在配置数据源代码下:


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

return registrationBean;
}

结果:

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

开启登录功能:

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

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

代码添加:


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

结果:

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

打开监控统计功能:

测试Sql监控功能。

网页地址:

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

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

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

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

开启Web应用功能:

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

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

网页地址

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

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

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

URL监控

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

配置防火墙:

wallfilter

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

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


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

结果:

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

参考文献

Druid官方github地址

Druid中文文档

引用

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

结束:

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

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

来源:https://www.cnblogs.com/xbhog/p/15108549.html

标签:SpringBoot,数据访问,Druid,数据源
0
投稿

猜你喜欢

  • Android 拍照后返回缩略图的两种方法介绍

    2023-02-06 02:06:28
  • Android中实现地址栏输入网址能浏览该地址网页源码并操作访问网络

    2022-08-21 16:11:42
  • 详解Android全局异常的捕获处理

    2023-02-05 09:02:11
  • idea生成类注释和方法注释的正确方法(推荐)

    2022-09-11 03:45:14
  • 解析Java内存分配和回收策略以及MinorGC、MajorGC、FullGC

    2023-02-06 08:22:19
  • Android中使用AspectJ详解

    2022-01-29 19:12:05
  • Android详解之NoHttp最基本使用(无封装)

    2022-09-28 17:11:51
  • SpringCloud搭建netflix-eureka微服务集群的过程详解

    2023-09-02 18:11:52
  • C# 创建控制台应用程序

    2023-10-09 07:27:37
  • Android SlidingDrawer 抽屉效果的实现

    2023-08-02 07:58:30
  • SpringMVC实现文件上传下载功能

    2023-09-05 19:49:39
  • Android实现根据评分添加星级条

    2021-10-30 13:19:57
  • C#弹出对话框确定或者取消执行相应操作的实例代码

    2021-11-19 13:26:29
  • Java正则之贪婪匹配、惰性匹配

    2022-08-14 16:41:23
  • Spring Cache手动清理Redis缓存

    2023-11-29 02:49:52
  • Android设计模式之Builder模式详解

    2022-01-17 12:29:02
  • Android设置默认锁屏壁纸接口的方法

    2021-09-25 00:16:42
  • AJAX中Get请求报错404的原因以及解决办法

    2021-07-03 05:41:07
  • spring-boot使用AOP统一处理日志

    2023-06-09 05:12:35
  • C#设计模式之外观模式介绍

    2023-03-15 06:22:31
  • asp之家 软件编程 m.aspxhome.com