SpringBoot中怎么使用Druid數據源,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
數據訪問之Druid數據源的使用
說明:該數據源Druid,使用自定義方式實現,后面文章使用start啟動器實現,學習思路為主。
為什么要使用數據源:
數據源是提高數據庫連接性能的常規手段,數據源會負責維持一個數據連接池,當程序創建數據源實例時,系統會一次性地創建多個數據庫連接,并把這些數據庫連接保存在連接池中。
當程序需要進行數據庫訪問時,無須重新獲得數據庫連接,而是從連接池中取出一個空閑的數據庫連接。
當程序使用數據庫連接訪問數據庫結束后,無須關閉數據庫連接,而是將數據庫連接歸還給連接池即可。
通過這種方式,就可避免頻繁地獲取數據庫連接、關閉數據庫連接所導致的性能下降
數據源是提高數據庫連接性能的常規手段,數據源會負責維持一個數據連接池,當程序創建數據源實例時,系統會一次性地創建多個數據庫連接,并把這些數據庫連接保存在連接池中。當程序需要進行數據庫訪問時,無須重新獲得數據庫連接,而是從連接池中取出一個空閑的數據庫連接。當程序使用數據庫連接訪問數據庫結束后,無須關閉數據庫連接,而是將數據庫連接歸還給連接池即可。通過這種方式,就可避免頻繁地獲取數據庫連接、關閉數據庫連接所導致的性能下降。
Druid官方github地址
Druid中文文檔
Druid的介紹以及優點:
Druid是阿里巴巴開源平臺上一個數據庫連接池實現,它不但結合了C3P0、DBCP、PROXOOL等數據庫連接池的優點,同時還加入了日志監控,可以分別監控DB池連接和SQL的執行情 況,是一款針對監控而生的數據庫連接池
自定義
找starter
引入數據源
博主版本: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
具體的配置綁定:個人博客
配置監控頁:
貼心文檔鏈接:網頁地址
我們需要配置一個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; } }
結果:
關于SpringBoot中怎么使用Druid數據源問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。