SpringBoot數據訪問之Druid數據源的使用
- 2021 年 8 月 6 日
- 筆記
- springboot
數據訪問之Druid數據源的使用
說明:該數據源Druid,使用自定義方式實現,後面文章使用start啟動器實現,學習思路為主。
為什麼要使用數據源:
數據源是提高資料庫連接性能的常規手段,數據源會負責維持一個數據連接池,當程式創建數據源實例時,系統會一次性地創建多個資料庫連接,並把這些資料庫連接保存在連接池中。
當程式需要進行資料庫訪問時,無須重新獲得資料庫連接,而是從連接池中取出一個空閑的資料庫連接。
當程式使用資料庫連接訪問資料庫結束後,無須關閉資料庫連接,而是將資料庫連接歸還給連接池即可。
通過這種方式,就可避免頻繁地獲取資料庫連接、關閉資料庫連接所導致的性能下降
—引自
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,然後進入//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監控
配置防火牆:
所以我們可以結合Filter一起使用,程式碼如下:得先進行sql的請求。
public class MyDtaSourceConfig {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入監控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
}
結果:
參考文獻
SpringBoot2零基礎入門springboot全套完整版
結束:
如果你看到這裡或者正好對你有所幫助,希望能點個關注或者推薦,感謝;
有錯誤的地方,歡迎在評論指出,作者看到會進行修改。