SpringBoot整合Druid實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密
1 引言
1.1 簡介
Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項目。Druid連接池為監(jiān)控而生,內(nèi)置強大的監(jiān)控功能,監(jiān)控特性不影響性能。功能強大,能防SQL注入,內(nèi)置Loging能診斷Hack應(yīng)用行為。除了提供基本的數(shù)據(jù)源功能外,還具備以下優(yōu)勢:
- 性能優(yōu)越:Druid連接池的性能表現(xiàn)優(yōu)于其他常見連接池,如C3P0和DBCP。
- 監(jiān)控功能強大:Druid內(nèi)置了豐富的監(jiān)控功能,可以實時查看SQL執(zhí)行情況、連接池狀態(tài)等。
- 穩(wěn)定性高:Druid在高并發(fā)環(huán)境下表現(xiàn)穩(wěn)定,能夠有效避免連接泄漏等問題。
- 擴展性好:Druid支持多種數(shù)據(jù)庫,且配置靈活,易于集成和擴展。
1.2 Druid的功能
高效的數(shù)據(jù)庫連接池管理
- 高性能:在并發(fā)環(huán)境下表現(xiàn)優(yōu)越,處理大量數(shù)據(jù)庫連接請求。
- 穩(wěn)定性:在高并發(fā)和高負載情況下保持穩(wěn)定,避免連接泄漏。
- 易用性:配置簡單,快速集成到Java應(yīng)用中。
豐富的監(jiān)控功能
- 連接池監(jiān)控:實時監(jiān)控連接池狀態(tài),如連接數(shù)、空閑連接數(shù)等。
- SQL監(jiān)控:記錄SQL執(zhí)行情況,統(tǒng)計執(zhí)行時間、次數(shù)等。
- URI監(jiān)控:監(jiān)控各URI的訪問情況,統(tǒng)計請求次數(shù)和響應(yīng)時間。
- 防火墻功能:防止SQL注入攻擊,提升系統(tǒng)安全性。
便捷的配置和擴展
- 多數(shù)據(jù)庫支持:支持MySQL、Oracle、PostgreSQL等多種數(shù)據(jù)庫。
- 靈活配置:提供豐富的配置選項,靈活調(diào)整。
- 插件機制:支持插件擴展功能,如
stat、wall、log4j等。
SQL執(zhí)行日志和統(tǒng)計分析
- SQL執(zhí)行日志:記錄SQL執(zhí)行時間、次數(shù)、影響行數(shù)等。
- 統(tǒng)計分析:提供SQL執(zhí)行統(tǒng)計分析,幫助優(yōu)化SQL性能。
- 慢SQL檢測:自動檢測慢SQL,提供詳細執(zhí)行信息,便于調(diào)優(yōu)。
提高系統(tǒng)安全性
- SQL防火墻:配置防火墻規(guī)則,攔截非法SQL請求,防止SQL注入。
- 黑白名單機制:配置IP黑白名單,限制特定IP訪問權(quán)限。
1.3 競品對比
| 功能類別 | 功能 | Druid | HikariCP | DBCP | Tomcat-jdbc | C3P0 |
|---|---|---|---|---|---|---|
| 性能 | PSCache | 是 | 否 | 是 | 是 | 是 |
| LRU | 是 | 否 | 是 | 是 | 是 | |
| SLB負載均衡支持 | 是 | 否 | 否 | 否 | 否 | |
| 穩(wěn)定性 | ExceptionSorter | 是 | 否 | 否 | 否 | 否 |
| 擴展 | 擴展 | Filter | JdbcIntercepter | |||
| 監(jiān)控 | 監(jiān)控方式 | jmx/log/http | jmx/metrics | jmx | jmx | jmx |
| 支持SQL級監(jiān)控 | 是 | 否 | 否 | 否 | 否 | |
| Spring/Web關(guān)聯(lián)監(jiān)控 | 是 | 否 | 否 | 否 | 否 | |
| 診斷支持 | LogFilter | 否 | 否 | 否 | 否 | |
| 連接泄露診斷 | logAbandoned | 否 | 否 | 否 | 否 | |
| 安全 | SQL防注入 | 是 | 無 | 無 | 無 | 無 |
| 支持配置加密 | 是 | 否 | 否 | 否 | 否 |
2 準備工作
2.1 項目環(huán)境
- JDK版本:JDK 17
- Spring Boot版本:Spring Boot 3.2.2
- MySQL版本:8.0.37
- 構(gòu)建工具:Maven
3 集成Druid
3.1 添加依賴
這里的Druid版本必須要選擇1.2.20及以上版本,否則無法運行。
還有一點,Druid的版本要與mysql-connector-java的版本相匹配,可以去下面的網(wǎng)站看:
Maven Repository: com.alibaba » druid » 1.2.20 (mvnrepository.com)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
3.2 配置Druid
相關(guān)配置的詳細信息可見:DruidDataSource配置屬性列表 · alibaba/druid Wiki (github.com)
spring:
application:
name: server
profiles:
active: dev # 激活dev配置文件
datasource:
url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ${voyager.db.pw}
# druid 相關(guān)參數(shù)配置
druid:
# 初始化連接大小
initial-size: 5
# 最小連接池數(shù)量
min-idle: 5
# 最大連接池數(shù)量
max-active: 20
# 獲取連接時最大等待時間,單位毫秒
max-wait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
# 測試連接
validation-query: SELECT 1 FROM DUAL
# 配置監(jiān)控統(tǒng)計用的filters,過濾掉靜態(tài)文件
web-stat-filter:
# 啟用Web統(tǒng)計過濾器
enabled: true
# 過濾匹配規(guī)則
url-pattern: /*
# 過濾忽略的格式
exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico
# 配置可視化控制臺頁面
stat-view-servlet:
enabled: true
# 訪問Druid監(jiān)控頁面的地址,首頁默認是 /druid/index.html
url-pattern: /druid/*
# 禁用重置按鈕
reset-enable: true
# 登錄用戶名
login-username: root
# 登錄密碼
login-password: 123456
# 通過別名的方式配置擴展插件 常用的插件有:監(jiān)控統(tǒng)計用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall 防御sql注入的filter:wall
filter:
stat:
enabled: true
# 是否開啟慢sql
log-slow-sql: true
# 是否開啟SQL合并
merge-sql: true
# 慢sql的時間標準 單位:毫秒
slow-sql-millis: 1000
3.3 編寫測試類測試
注意:不要使用lombok的@RequiredArgsConstructor注解,JUnit5好像無法自動裝配。
@SpringBootTest
class SmartApplicationTest {
@Autowired
private DataSource dataSource ;
@Test
void contextLoads() {
System.out.println(dataSource.getClass());
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println("druidDataSource.getUrl() = " + druidDataSource.getUrl());
System.out.println("druidDataSource.getUsername() = " + druidDataSource.getUsername());
System.out.println("druidDataSource.getInitialSize() = " + druidDataSource.getInitialSize());
System.out.println("druidDataSource.getMaxActive() = " + druidDataSource.getMaxActive());
}
}
運行測試:

可以看到配置類的相關(guān)配置已經(jīng)生效。
3.4 訪問控制臺
啟動自己項目中的SpringBootApplication類后訪問http://localhost:8084/druid/login.html(改為自己服務(wù)的端口),輸入賬號密碼后即可進入:

3.5 測試SQL監(jiān)控
測試接口
@RequestMapping("/user")
@RestController
@RequiredArgsConstructor
public class UserInfoController {
private final UserInfoService userInfoService;
@GetMapping("/test")
public Result<UserInfo> login() {
return Result.success(userInfoService.getById(1));
}
}
進行測試

3.6 數(shù)據(jù)庫密碼加密
3.6.1 執(zhí)行命令加密數(shù)據(jù)庫密碼
在命令行中執(zhí)行如下命令:
java -cp D:\Develop\Maven\mvnRespo\com\alibaba\druid\1.2.20\druid-1.2.20.jar com.alibaba.druid.filter.config.ConfigTools your_password
輸出
privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg== publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ== password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
3.6.2 配置參數(shù)
spring:
datasource:
url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: password # 修改為控制臺輸出的password
#druid數(shù)據(jù)源配置
druid:
# Druid數(shù)據(jù)源的公鑰
public-key: publicKey # 修改為控制臺輸出的publicKey
filter:
# 啟用Druid的過濾器配置
config:
enabled: true
connect-properties:
# 啟用Druid的連接屬性解密功能
config.decrypt: true
config.decrypt.key: publicKey # 控制臺輸出的publicKey
3.6.3 測試
啟動啟動類,請求測試接口:

4 總結(jié)
在這篇文章中,我們詳細介紹了如何在Spring Boot項目中集成Druid數(shù)據(jù)源,并實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密等功能,Druid還有許多有用的功能,這里就不過多展示了,希望本文對大家有所幫助。
以上就是SpringBoot整合Druid實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密的詳細內(nèi)容,更多關(guān)于SpringBoot SQL監(jiān)控和密碼加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot將mybatis升級為mybatis-plus的實現(xiàn)
之前項目工程用的是mybatis,現(xiàn)在需要將其替換為mybatis-plus,本文主要介紹了springboot將mybatis升級為mybatis-plus的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09
SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析
這篇文章主要介紹了Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
SpringMVC框架實現(xiàn)Handler處理器的三種寫法
這篇文章主要介紹了SpringMVC框架實現(xiàn)Handler處理器的三種寫法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Mybatis 動態(tài)sql if 判讀條件等于一個數(shù)字的案例
這篇文章主要介紹了Mybatis 動態(tài)sql if 判讀條件等于一個數(shù)字的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
java安全fastjson1.2.24反序列化TemplatesImpl分析
這篇文章主要介紹了java安全fastjson1.2.24反序列化TemplatesImpl分析,fastjson是alibaba開源的一個用于處理json數(shù)據(jù)格式的解析庫,它支持將java對象解析成json字符串格式的數(shù)據(jù),也可以將json字符串還原成java對象2022-07-07
jmeter添加自定函數(shù)的實例(jmeter5.3+IntelliJ IDEA)
這篇文章主要介紹了jmeter添加自定函數(shù)的實例(jmeter5.3+IntelliJ IDEA),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Java8中Lambda表達式使用和Stream API詳解
這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達式使用和Stream API的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

