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

配置監控頁:

貼心文檔鏈接:網頁地址

我們需要配置一個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全套完整版

結束:

如果你看到這裡或者正好對你有所幫助,希望能點個關註或者推薦,感謝;

有錯誤的地方,歡迎在評論指出,作者看到會進行修改。

到此這篇關於SpringBoot數據訪問自定義使用Druid數據源的方法的文章就介紹到這瞭,更多相關SpringBoot數據訪問使用Druid數據源內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: