SpringBoot數(shù)據(jù)訪問(wèn)自定義使用Druid數(shù)據(jù)源的方法
數(shù)據(jù)訪問(wèn)之Druid數(shù)據(jù)源的使用
說(shuō)明:該數(shù)據(jù)源Druid,使用自定義方式實(shí)現(xiàn),后面文章使用start啟動(dòng)器實(shí)現(xiàn),學(xué)習(xí)思路為主。
為什么要使用數(shù)據(jù)源:
數(shù)據(jù)源是提高數(shù)據(jù)庫(kù)連接性能的常規(guī)手段,數(shù)據(jù)源會(huì)負(fù)責(zé)維持一個(gè)數(shù)據(jù)連接池,當(dāng)程序創(chuàng)建數(shù)據(jù)源實(shí)例時(shí),系統(tǒng)會(huì)一次性地創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)連接,并把這些數(shù)據(jù)庫(kù)連接保存在連接池中。
當(dāng)程序需要進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)時(shí),無(wú)須重新獲得數(shù)據(jù)庫(kù)連接,而是從連接池中取出一個(gè)空閑的數(shù)據(jù)庫(kù)連接。
當(dāng)程序使用數(shù)據(jù)庫(kù)連接訪問(wèn)數(shù)據(jù)庫(kù)結(jié)束后,無(wú)須關(guān)閉數(shù)據(jù)庫(kù)連接,而是將數(shù)據(jù)庫(kù)連接歸還給連接池即可。
通過(guò)這種方式,就可避免頻繁地獲取數(shù)據(jù)庫(kù)連接、關(guān)閉數(shù)據(jù)庫(kù)連接所導(dǎo)致的性能下降
為什么要使用數(shù)據(jù)源
數(shù)據(jù)源是提高數(shù)據(jù)庫(kù)連接性能的常規(guī)手段,數(shù)據(jù)源會(huì)負(fù)責(zé)維持一個(gè)數(shù)據(jù)連接池,當(dāng)程序創(chuàng)建數(shù)據(jù)源實(shí)例時(shí),系統(tǒng)會(huì)一次性地創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)連接,并把這些數(shù)據(jù)庫(kù)連接保存在連接池中。當(dāng)程序需要進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)時(shí),無(wú)須重新獲得數(shù)據(jù)庫(kù)連接,而是從連接池中取出一個(gè)空閑的數(shù)據(jù)庫(kù)連接。當(dāng)程序使用數(shù)據(jù)庫(kù)連接訪問(wèn)數(shù)據(jù)庫(kù)結(jié)束后,無(wú)須關(guān)閉數(shù)據(jù)庫(kù)連接,而是將數(shù)據(jù)庫(kù)連接歸還給連接池即可。通過(guò)這種方式,就可避免頻繁地獲取數(shù)據(jù)庫(kù)連接、關(guān)閉數(shù)據(jù)庫(kù)連接所導(dǎo)致的性能下降。
Druid的介紹以及優(yōu)點(diǎn):
Druid是阿里巴巴開(kāi)源平臺(tái)上一個(gè)數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn),它不但結(jié)合了C3P0、DBCP、PROXOOL等數(shù)據(jù)庫(kù)連接池的優(yōu)點(diǎn),同時(shí)還加入了日志監(jiān)控,可以分別監(jiān)控DB池連接和SQL的執(zhí)行情 況,是一款針對(duì)監(jiān)控而生的數(shù)據(jù)庫(kù)連接池
整合第三方技術(shù)的兩種方式
- 自定義
- 找starter
自定義實(shí)現(xiàn)Druid數(shù)據(jù)源
引入數(shù)據(jù)源
博主版本:1.2.6
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>版本號(hào)</version> </dependency>
配置數(shù)據(jù)源
因?yàn)樵谝霐?shù)據(jù)源,SpringBoot默配置的數(shù)據(jù)源是HikariDataSource
,所以我們?nèi)绻褂肈ruid的話,需要自己創(chuàng)建一個(gè)數(shù)據(jù)源,并放到容器中使用,myDataSourceConfig文件代碼如下:
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; //注意不要導(dǎo)錯(cuò)包 @Configuration //配置數(shù)據(jù)源 public class MyDtaSourceConfig { @Bean public DataSource dataSource() { return new DruidDataSource(); //創(chuàng)建Druid數(shù)據(jù)源 } }
為什么我們創(chuàng)建的數(shù)據(jù)源可以使用呢?
在DataSourceAutoConfiguration中的以下部分可以發(fā)現(xiàn):
@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
這個(gè)默認(rèn)類,點(diǎn)擊進(jìn)入,
@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; } }
由上述代碼可以發(fā)現(xiàn),默認(rèn)的配置源是HikariDataSource,但是有一個(gè)要求:
@ConditionalOnMissingBean(DataSource.class)
就是如果在容器中沒(méi)有數(shù)據(jù)源,下面代碼生效,也就是使用HikariDataSource,但是若容器中已經(jīng)有開(kāi)發(fā)者創(chuàng)建的數(shù)據(jù)源,那么開(kāi)發(fā)者創(chuàng)建的優(yōu)先。
在使用數(shù)據(jù)源的時(shí)候,不可避免地需要配置基本的屬性,如:url、用戶名、密碼、端口號(hào)等。所以我們可以將這些信息抽取出來(lái),放到配置文件中,
這里我們采用yaml寫法application.yaml:
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
使用ConfigurationProperties注解來(lái)進(jìn)行屬性的綁定:
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 //配置數(shù)據(jù)源 public class MyDtaSourceConfig { @ConfigurationProperties("spring.datasource") //屬性綁定 要加對(duì)位置 @Bean public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } }
進(jìn)行單元測(cè)試:
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("數(shù)據(jù)類型:{}",dataSource.getClass()); } }
結(jié)果==> 數(shù)據(jù)類型:class com.alibaba.druid.pool.DruidDataSource
具體的配置綁定:個(gè)人博客
Druid中的其他功能
配置監(jiān)控頁(yè):
貼心文檔鏈接:網(wǎng)頁(yè)地址
我們需要配置一個(gè)servlet配置,然后放到容器中,輸入賬號(hào)密碼,進(jìn)入鏈接地址即可訪問(wèn);
在配置數(shù)據(jù)源代碼下:
/** * 配置監(jiān)控頁(yè) */ @Bean public ServletRegistrationBean staViewServlet(){ //實(shí)例化StatViewServlet StatViewServlet statViewServlet = new StatViewServlet(); //將實(shí)例化的實(shí)例化StatViewServlet 傳入ServletRegistrationBean,并設(shè)置訪問(wèn)路徑 ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*"); return registrationBean; }
結(jié)果:
開(kāi)啟登錄功能:
因?yàn)榈卿浽O(shè)置還是在servlet中設(shè)置的,所以相關(guān)信息暫略,貼一個(gè)文檔截圖:
代碼添加:
@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; }
結(jié)果:
打開(kāi)監(jiān)控統(tǒng)計(jì)功能:
測(cè)試Sql監(jiān)控功能。
創(chuàng)建一個(gè)DruidDataSource組件,并配置其中的屬性filters的value為stat,這樣才能打開(kāi)監(jiān)控功能。
所以我們?cè)趧?chuàng)建數(shù)據(jù)源的地方需要配置filters屬性:
public class MyDtaSourceConfig { @ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource(); //加入監(jiān)控功能 druidDataSource.setFilters("stat"); return druidDataSource; } }
也可以進(jìn)行屬性的配置來(lái)實(shí)現(xiàn)上述的效果:(第二種方法)
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
然后設(shè)置一個(gè)請(qǐng)求,來(lái)測(cè)試監(jiān)控功能;
創(chuàng)建一個(gè)controller:
@Controller public class tablecontro { @Autowired JdbcTemplate jdbcTemplate; @ResponseBody //不經(jīng)過(guò)視圖解析器 @GetMapping("/sql") public String druidquery(){ Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class); return aLong.toString(); } }
先訪問(wèn)localhost:8080/sql,然后進(jìn)入http://localhost:8080/druid/index.html頁(yè)面中的SQL監(jiān)控,即可查看執(zhí)行次數(shù)次數(shù)。
在最大并發(fā)的后面的有各種分布,可以參考官方文檔:Druid連接池介紹
開(kāi)啟Web應(yīng)用功能:
基本上還是跟上面一樣的;
WebStatFilter用于采集web-jdbc關(guān)聯(lián)監(jiān)控的數(shù)據(jù)。
配置一個(gè)WebStatFilter,然后需要初始化exclusions,來(lái)排除一些不必要的url.得先進(jìn)行sql的請(qǐng)求
/** * WebStatFilter用于采集web-jdbc關(guān)聯(lián)監(jiān)控的數(shù)據(jù)。 */ @Bean public FilterRegistrationBean webRegistrationBean(){ WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter); registrationBean.setUrlPatterns(Arrays.asList("/*")); //添加一些不必要的ulr,在初始化的時(shí)候就執(zhí)行 registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return registrationBean; }
結(jié)果:
Web應(yīng)用:
URL監(jiān)控
配置防火墻:
所以我們可以結(jié)合Filter一起使用,代碼如下:得先進(jìn)行sql的請(qǐng)求。
public class MyDtaSourceConfig { @ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource(); //加入監(jiān)控功能 druidDataSource.setFilters("stat,wall"); return druidDataSource; } }
結(jié)果:
參考文獻(xiàn)
SpringBoot2零基礎(chǔ)入門springboot全套完整版
結(jié)束:
如果你看到這里或者正好對(duì)你有所幫助,希望能點(diǎn)個(gè)關(guān)注或者推薦,感謝;
有錯(cuò)誤的地方,歡迎在評(píng)論指出,作者看到會(huì)進(jìn)行修改。
到此這篇關(guān)于SpringBoot數(shù)據(jù)訪問(wèn)自定義使用Druid數(shù)據(jù)源的方法的文章就介紹到這了,更多相關(guān)SpringBoot數(shù)據(jù)訪問(wèn)使用Druid數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方法詳解
- 基于Springboot+Mybatis對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方式分享
- springboot數(shù)據(jù)訪問(wèn)和數(shù)據(jù)視圖的使用方式詳解
- SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問(wèn)
- 深入了解Springboot核心知識(shí)點(diǎn)之?dāng)?shù)據(jù)訪問(wèn)配置
- SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問(wèn)的詳細(xì)過(guò)程
- SpringBoot+MyBatis簡(jiǎn)單數(shù)據(jù)訪問(wèn)應(yīng)用的實(shí)例代碼
- SpringBoot數(shù)據(jù)訪問(wèn)的實(shí)現(xiàn)
相關(guān)文章
Mybatis事務(wù)如何跟Spring結(jié)合(數(shù)據(jù)庫(kù)事務(wù)特性和Spring事務(wù)管理源碼)
MyBatis與Spring的事務(wù)結(jié)合主要是通過(guò)Spring的事務(wù)管理和MyBatis的數(shù)據(jù)庫(kù)操作來(lái)實(shí)現(xiàn)的,在本文中,我們將從數(shù)據(jù)庫(kù)事務(wù)特性和Spring事務(wù)管理源碼兩個(gè)角度來(lái)分析MyBatis事務(wù)如何與Spring結(jié)合到一起的原理,感興趣的朋友一起看看吧2024-01-01springboot2.x整合redis知識(shí)點(diǎn)講解
在本篇文章中小編給大家分享的是一篇關(guān)于springboot2.x整合redis知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-01-01SpringBoot2之PUT請(qǐng)求接收不了參數(shù)的解決方案
這篇文章主要介紹了SpringBoot2之PUT請(qǐng)求接收不了參數(shù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07PowerJob的IdGenerateService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的IdGenerateService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01