引言
在現(xiàn)代的Web應(yīng)用開(kāi)發(fā)中,高性能的數(shù)據(jù)庫(kù)連接池是確保應(yīng)用穩(wěn)定性和響應(yīng)性的關(guān)鍵因素之一。Druid是一個(gè)開(kāi)源的高性能數(shù)據(jù)庫(kù)連接池,具有強(qiáng)大的監(jiān)控和統(tǒng)計(jì)功能,能夠在Spring Boot應(yīng)用中提供出色的數(shù)據(jù)庫(kù)連接管理。本文將研究在Spring Boot中集成Druid連接池的步驟,以及如何通過(guò)其豐富的特性優(yōu)化應(yīng)用的數(shù)據(jù)庫(kù)性能。
數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接池是程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,由程序動(dòng)態(tài)的對(duì)池中的連接進(jìn)行申請(qǐng)、使用、釋放。
為什么需要使用數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接是一件費(fèi)時(shí)的操作,連接池可以使多個(gè)操作共享一個(gè)鏈接:數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)連接建立一個(gè)緩沖池,與現(xiàn)在緩沖池中放入一定數(shù)量
的連接,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從緩沖池中取出一個(gè),使用完畢后再放回去:使用數(shù)據(jù)庫(kù)連接池可以提高對(duì)數(shù)據(jù)庫(kù)連接資源的管理,數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分
配、管理和釋放數(shù)據(jù)庫(kù)連接,允許程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè);可以通過(guò)設(shè)定連接池最大連接數(shù)來(lái)防止系統(tǒng)無(wú)盡的與數(shù)據(jù)庫(kù)連接
常見(jiàn)的連接池種類
- JDBCP連接池:采用標(biāo)準(zhǔn)的Java EE JDBC AP來(lái)實(shí)現(xiàn),同時(shí)支持NDl,非常靈活;但是版本比較老了,而且在高并發(fā)場(chǎng)景下性能可能存在問(wèn)題
- c3p0連接池:功能齊全,能夠自動(dòng)維護(hù)連接池,支持JDBC3規(guī)范和JDBC2的標(biāo)準(zhǔn)擴(kuò)展,性能較好:但是配置過(guò)于復(fù)雜,容易造成資源浪費(fèi)
- HikariCPi連接池:專為高并發(fā)場(chǎng)景設(shè)計(jì),性能優(yōu)越,具有最快的初始化速度和最小的延遲,支持JDBC4 API;但是由于需要更多的VM資源,可能會(huì)造成資源消耗問(wèn)題
- druid連接池:支持DBC和Dracle驅(qū)動(dòng)程序,全面的性能監(jiān)測(cè),對(duì)等分布式,具有強(qiáng)大的擴(kuò)展功能和高度定制化配置
Druid介紹
Druid是一個(gè)阿里巴巴結(jié)合了c3p0、DBCP等DB池的優(yōu)點(diǎn)開(kāi)源的數(shù)據(jù)庫(kù)連接池和SQL查詢優(yōu)化工具,用于提高應(yīng)用程序?qū)?shù)據(jù)庫(kù)的性能和可擴(kuò)展性。主要提供的功能:數(shù)據(jù)庫(kù)連接池、數(shù)據(jù)庫(kù)連接池監(jiān)控、SQL查詢優(yōu)化、數(shù)據(jù)源管理、防御SQL注入、統(tǒng)計(jì)和監(jiān)控。
注意:SpringBoot2.0默認(rèn)是用com.zaxxer.hikari.HikariDataSource作為數(shù)據(jù)源。
-
Druid功能
-
數(shù)據(jù)源監(jiān)控: 顯示數(shù)據(jù)源的基本信息、活躍連接數(shù)、連接等待數(shù)量等。
-
SQL監(jiān)控: 統(tǒng)計(jì)SQL執(zhí)行的次數(shù)、執(zhí)行時(shí)間、錯(cuò)誤次數(shù)等,幫助優(yōu)化SQL性能。
-
日志監(jiān)控: 展示Druid內(nèi)部日志,幫助定位問(wèn)題。
-
防火墻監(jiān)控: 配置SQL防火墻規(guī)則,提高數(shù)據(jù)庫(kù)安全性。
查看當(dāng)前數(shù)據(jù)源的測(cè)試代碼
@SpringBootTest
public class DruidTest {
@Autowired
private DataSource dataSource;
@Test
void test(){
System.out.println(dataSource.getClass());
}
}
druid 和 druid-spring-boot-starter區(qū)別
-
druid-spring-boot-starter
?是在?druid
?基礎(chǔ)上進(jìn)行了封裝,專用于集成?spring-boot
?項(xiàng)目,無(wú)需編寫配置類文件。個(gè)性化的配置。為專用格式。按照SpringBoot整合其他技術(shù)的通用規(guī)則來(lái),導(dǎo)入對(duì)應(yīng)的starter,進(jìn)行相應(yīng)的配置即可。 -
druid
?需要自己手動(dòng)編寫一個(gè)配置類文件。為通用格式,不管你換什么數(shù)據(jù)源都可以用這種形式進(jìn)行配置。
druid傳統(tǒng)的配置
-
引入Druid依賴
在Spring Boot項(xiàng)目的pom.xml
文件中,引入Druid和數(shù)據(jù)庫(kù)驅(qū)動(dòng)的相關(guān)依賴:
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- MySQL Connector 數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
-
配置Druid連接池
在application.properties
或application.yml
中配置Druid連接池的相關(guān)參數(shù):
spring:
datasource:
username: root
password: root
#?serverTimezone=UTC解決時(shí)區(qū)的報(bào)錯(cuò)
url: jdbc:mysql://localhost:3306/druid
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 默認(rèn)是不注入這些屬性值的,需要自己綁定
#druid 數(shù)據(jù)源專有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置監(jiān)控統(tǒng)計(jì)攔截的filters,stat:監(jiān)控統(tǒng)計(jì)、log4j:日志記錄、wall:防御sql注入
#如果允許時(shí)報(bào)錯(cuò) java.lang.ClassNotFoundException: org.apache.log4j.Priority
#則導(dǎo)入 log4j 依賴即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
注意:這些配置暫時(shí)還沒(méi)生效,因?yàn)檫@會(huì)還沒(méi)有把自定義的屬性配置上去
我們?cè)谂渲梦募信渲米畲筮B接數(shù)為20,初始化連接數(shù)為5
測(cè)試一下看看
-
引入Druid依賴(根據(jù)自己配置參數(shù)按需引入)
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
-
綁定全局配置文件中的參數(shù)
package com.example.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;
//這是一個(gè)配置類 需要加@Configuration 這個(gè)注解
@Configuration
public class DruidConfig {
/*
將 自定義的 Druid數(shù)據(jù)源 添加到容器中,不再讓 Spring Boot 自動(dòng)創(chuàng)建(自動(dòng)創(chuàng)建的是HikariDataSource)
綁定全局配置文件中的 druid 數(shù)據(jù)源屬性到 com.alibaba.druid.pool.DruidDataSource從而讓它們生效,綁定操作就是加上以下注解
@ConfigurationProperties(prefix = "spring.datasource"):作用就是將 全局配置文件中
前綴為 spring.datasource的屬性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名參數(shù)中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
然后我們?cè)贉y(cè)試一下剛才的測(cè)試方法看看配置是否生效
-
配置Druid數(shù)據(jù)源監(jiān)控
Druid數(shù)據(jù)源具有監(jiān)控的功能,并提供了一個(gè)web界面方便用戶查看。我們需要設(shè)置Druid,后臺(tái)管理頁(yè)面,如登錄賬號(hào)、密碼等.
//配置 Druid 監(jiān)控管理后臺(tái)的Servlet;
//因?yàn)閟pringboot內(nèi)置了 Servlet 容器,所以沒(méi)有了web.xml文件, 替代的方法就是 ServletRegistrationBean (Spring Boot的注冊(cè) Servlet方式)
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 這些參數(shù)可以在 com.alibaba.druid.support.http.StatViewServlet 的父類 com.alibaba.druid.support.http.ResourceServlet 中找到
//后臺(tái)需要有人登錄,賬號(hào)密碼的配置
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); //后臺(tái)管理界面的登錄賬號(hào)
initParams.put("loginPassword", "admin"); //后臺(tái)管理界面的登錄密碼
//后臺(tái)允許誰(shuí)可以訪問(wèn)
//initParams.put("allow", "localhost"):表示只有本機(jī)可以訪問(wèn)
//initParams.put("allow", ""):為空或者為null時(shí),表示允許所有訪問(wèn)
initParams.put("allow", "");
//deny:Druid 后臺(tái)拒絕誰(shuí)訪問(wèn) initParams.put("user", "192.168.1.10");表示禁止此ip訪問(wèn)
//設(shè)置初始化參數(shù)
bean.setInitParameters(initParams);
return bean;
}
啟動(dòng)項(xiàng)目,訪問(wèn)http://localhost:8080/druid/login.html
輸入配置賬號(hào)登錄
’
-
配置Druid Web監(jiān)控Filter過(guò)濾器
//配置 Druid 監(jiān)控 之 web 監(jiān)控的 filter (在之前是在web.xml中配置過(guò)濾器)
//WebStatFilter:用于配置Web和Druid數(shù)據(jù)源之間的管理關(guān)聯(lián)監(jiān)控統(tǒng)計(jì)
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:設(shè)置哪些請(qǐng)求進(jìn)行過(guò)濾排除掉,從而不進(jìn)行統(tǒng)計(jì)
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*"); //這些東西不進(jìn)行統(tǒng)計(jì)
bean.setInitParameters(initParams);
// "/*" 表示過(guò)濾所有請(qǐng)求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
druid-spring-boot-starter配置
-
引入Druid配置
依賴是druid-spring-boot-starter,它基于傳統(tǒng)的druid進(jìn)行了封裝,簡(jiǎn)化了配置,所以使用該依賴,同時(shí)引入log4j2的日志依賴,方便我們?cè)诒O(jiān)控時(shí)獲取日志信息。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
-
Druid配置
基于application.yml進(jìn)行配置
spring:
application:
name: druid-demo
datasource:
# 數(shù)據(jù)庫(kù)相關(guān)配置
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis01
username: root
password: root
druid:
# 初始化連接數(shù)量
initial-size: 5
# 最小線連接數(shù)量
min-idle: 5
# 最大連接數(shù)量
max-active: 20
# 獲取連接時(shí)最大等待時(shí)間,單位毫秒
max-wait: 60000
#銷毀線程時(shí)檢測(cè)當(dāng)前連接的最后活動(dòng)時(shí)間和當(dāng)前時(shí)間差大于該值時(shí),關(guān)閉當(dāng)前連接
min-evictable-idle-time-millis: 30000
#用來(lái)檢測(cè)連接是否有效的sql 必須是一個(gè)查詢語(yǔ)句
#mysql中為 select 'x'
#oracle中為 select 1 from dual
validation-query: select 'x'
#申請(qǐng)連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開(kāi)啟會(huì)降低性能,默認(rèn)為true
test-on-borrow: false
#歸還連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開(kāi)啟會(huì)降低性能,默認(rèn)為tru
test-on-return: false
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),'wall'用于防火墻
# 配置監(jiān)拉統(tǒng)計(jì)擋成的filters. stat: 監(jiān)控統(tǒng)計(jì)、Log4j:日志記錄、waLL: 防御sqL注入
filters: stat,wall,log4j2
# 配置后臺(tái)監(jiān)控
stat-view-servlet:
# 允許訪問(wèn)的地址,這里因?yàn)闀r(shí)本地所以配置當(dāng)前機(jī)器
allow: 127.0.0.1
# 是否開(kāi)啟訪問(wèn)
enabled: true
# 是否能夠重置數(shù)據(jù)
reset-enable: false
# 管理頁(yè)面登陸的用戶名
login-username: admin
# 管理頁(yè)面登陸的密碼
login-password: admin
可以看到相較于傳統(tǒng)的配置(不需要配置DruidConfig,僅僅作為對(duì)比)方式:
更加簡(jiǎn)潔了,開(kāi)發(fā)人員只需要專注于配置信息,就可以快速的配置啟用druid了,大大的提高了開(kāi)發(fā)效率文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-804614.html
結(jié)語(yǔ)
通過(guò)本文的介紹,你已經(jīng)學(xué)會(huì)了在Spring Boot中集成Druid連接池的全過(guò)程,并了解了如何通過(guò)Druid的監(jiān)控頁(yè)面進(jìn)行實(shí)時(shí)監(jiān)控和統(tǒng)計(jì)。Druid連接池不僅提供了高性能的連接池功能,還附帶了豐富的監(jiān)控和統(tǒng)計(jì)工具,助力開(kāi)發(fā)者更好地管理和優(yōu)化數(shù)據(jù)庫(kù)性能。在實(shí)際項(xiàng)目中,合理配置Druid連接池參數(shù),結(jié)合監(jiān)控頁(yè)面,將會(huì)使應(yīng)用的數(shù)據(jù)庫(kù)性能達(dá)到事半功倍的效果。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-804614.html
到了這里,關(guān)于Spring Boot整合Druid(druid 和 druid-spring-boot-starter)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!