当前位置:   article > 正文

SpringBoot数据访问之Druid数据源的使用_druid访问地址

druid访问地址

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

为什么要使用数据源:

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

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

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

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

​ ---引自

Druid官方github地址

Druid中文文档

Druid的介绍以及优点:

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

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

  • 自定义
  • 找starter

自定义实现Druid数据源

引入数据源

博主版本:1.2.6

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid</artifactId>
  4. <version>版本号</version>
  5. </dependency>

配置数据源

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

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import javax.sql.DataSource; //注意不要导错包
  5. @Configuration
  6. //配置数据源
  7. public class MyDtaSourceConfig {
  8. @Bean
  9. public DataSource dataSource() {
  10. return new DruidDataSource(); //创建Druid数据源
  11. }
  12. }

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

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

  1. @Configuration(proxyBeanMethods = false)
  2. @Conditional(PooledDataSourceCondition.class)
  3. @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
  4. @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
  5. DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
  6. DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
  7. protected static class PooledDataSourceConfiguration {
  8. }

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

  1. @Configuration(proxyBeanMethods = false)
  2. @ConditionalOnClass(HikariDataSource.class)
  3. @ConditionalOnMissingBean(DataSource.class)
  4. @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
  5. matchIfMissing = true)
  6. static class Hikari {
  7. @Bean
  8. @ConfigurationProperties(prefix = "spring.datasource.hikari")
  9. HikariDataSource dataSource(DataSourceProperties properties) {
  10. HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
  11. if (StringUtils.hasText(properties.getName())) {
  12. dataSource.setPoolName(properties.getName());
  13. }
  14. return dataSource;
  15. }
  16. }

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

@ConditionalOnMissingBean(DataSource.class)

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

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

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

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/vuesite
  4. username: root
  5. password: 123456
  6. driver-class-name: com.mysql.jdbc.Driver

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

  1. package com.xbhog.Config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import javax.sql.DataSource;
  7. @Configuration
  8. //配置数据源
  9. public class MyDtaSourceConfig {
  10. @ConfigurationProperties("spring.datasource") //属性绑定 要加对位置
  11. @Bean
  12. public DataSource dataSource() {
  13. DruidDataSource druidDataSource = new DruidDataSource();
  14. return druidDataSource;
  15. }
  16. }

进行单元测试:

  1. package com.xbhog;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.jdbc.core.JdbcTemplate;
  7. import javax.sql.DataSource;
  8. @SpringBootTest
  9. @Slf4j
  10. class FirstAdminApplicationTests {
  11. @Autowired
  12. DataSource dataSource;
  13. @Test
  14. void contextLoads() {
  15. log.info("数据类型:{}",dataSource.getClass());
  16. }
  17. }

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

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

Druid中的其他功能

配置监控页:

贴心文档链接:网页地址

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

在配置数据源代码下:

  1. /**
  2. * 配置监控页
  3. */
  4. @Bean
  5. public ServletRegistrationBean staViewServlet(){
  6. //实例化StatViewServlet
  7. StatViewServlet statViewServlet = new StatViewServlet();
  8. //将实例化的实例化StatViewServlet 传入ServletRegistrationBean,并设置访问路径
  9. ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
  10. return registrationBean;
  11. }

结果:

开启登录功能:

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

代码添加:

  1. @Bean
  2. public ServletRegistrationBean staViewServlet(){
  3. StatViewServlet statViewServlet = new StatViewServlet();
  4. ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
  5. //配置登录信息
  6. registrationBean.addInitParameter("loginUsername","admin");
  7. registrationBean.addInitParameter("loginPassword","123456");
  8. return registrationBean;
  9. }

结果:

打开监控统计功能:

测试Sql监控功能。

网页地址:

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

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

  1. public class MyDtaSourceConfig {
  2. @ConfigurationProperties("spring.datasource")
  3. @Bean
  4. public DataSource dataSource() throws SQLException {
  5. DruidDataSource druidDataSource = new DruidDataSource();
  6. //加入监控功能
  7. druidDataSource.setFilters("stat");
  8. return druidDataSource;
  9. }
  10. }

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

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/vuesite
  4. username: root
  5. password: 123456
  6. driver-class-name: com.mysql.jdbc.Driver
  7. filters: stat
  8. tomcat:
  9. max-active: 12

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

创建一个controller:

  1. @Controller
  2. public class tablecontro {
  3. @Autowired
  4. JdbcTemplate jdbcTemplate;
  5. @ResponseBody //不经过视图解析器
  6. @GetMapping("/sql")
  7. public String druidquery(){
  8. Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class);
  9. return aLong.toString();
  10. }
  11. }

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

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

开启Web应用功能:

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

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

网页地址

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

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

结果:

Web应用:

URL监控

配置防火墙:

wallfilter

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

  1. public class MyDtaSourceConfig {
  2. @ConfigurationProperties("spring.datasource")
  3. @Bean
  4. public DataSource dataSource() throws SQLException {
  5. DruidDataSource druidDataSource = new DruidDataSource();
  6. //加入监控功能
  7. druidDataSource.setFilters("stat,wall");
  8. return druidDataSource;
  9. }
  10. }

结果:

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号