資料訪問之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中設定的,所以相關資訊暫略,貼一個文件截圖:

程式碼新增:

@Beanpublic 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:

@Controllerpublic 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關聯監控的資料。     */@Beanpublic 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全套完整版

結束:

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

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