【第5章】SpringBoot整合Druid

文章目錄

  • 前言
  • 一、啟動器
  • 二、配置
    • 1.JDBC 配置
    • 2.連接池配置
    • 3. 監控配置
  • 三、配置多數據源
    • 1. 添加配置
    • 2. 創建數據源
  • 四、配置 Filter
    • 1. 配置Filter
    • 2. 可配置的Filter
  • 五、獲取 Druid 的監控數據
  • 六、案例
    • 1. 問題
    • 2. 引入庫
    • 3. 配置
    • 4. 配置類
    • 5. 測試類
    • 6. 測試結果
  • 七、案例 ( 推薦 ) \color{#00FF00}{(推薦)} (推薦)
    • 1. 引入庫
    • 2. 配置
    • 3. 測試類
    • 4. 測試結果
  • 總結


前言

Druid是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。


一、啟動器

Druid Spring Boot Starter 用于幫助你在Spring Boot項目中輕松集成Druid數據庫連接池和監控。

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.22</version>
</dependency>

二、配置

1.JDBC 配置

spring.datasource.druid.url= # 或spring.datasource.url= 
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=

2.連接池配置

spring.datasource.druid.initial-size=
spring.datasource.druid.max-active=
spring.datasource.druid.min-idle=
spring.datasource.druid.max-wait=
spring.datasource.druid.pool-prepared-statements=
spring.datasource.druid.max-pool-prepared-statement-per-connection-size= 
spring.datasource.druid.max-open-prepared-statements= #和上面的等價
spring.datasource.druid.validation-query=
spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=
spring.datasource.druid.test-on-return=
spring.datasource.druid.test-while-idle=
spring.datasource.druid.time-between-eviction-runs-millis=
spring.datasource.druid.min-evictable-idle-time-millis=
spring.datasource.druid.max-evictable-idle-time-millis=
spring.datasource.druid.filters= #配置多個英文逗號分隔
....//more

3. 監控配置

# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled= #是否啟用StatFilter默認值false
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=# StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled= #是否啟用StatViewServlet(監控頁面)默認值為false(考慮到安全問題默認并未啟動,如需啟用建議設置密碼或白名單以保障安全)
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
spring.datasource.druid.stat-view-servlet.login-username=
spring.datasource.druid.stat-view-servlet.login-password=
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=# Spring監控配置,說明請參考Druid Github Wiki,配置_Druid和Spring關聯監控配置
spring.datasource.druid.aop-patterns= # Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔

三、配置多數據源

1. 添加配置

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=# Druid 數據源配置,繼承spring.datasource.* 配置,相同則覆蓋
...
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=5
...# Druid 數據源 1 配置,繼承spring.datasource.druid.* 配置,相同則覆蓋
...
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=10000
...# Druid 數據源 2 配置,繼承spring.datasource.druid.* 配置,相同則覆蓋
...
spring.datasource.druid.two.max-active=20
spring.datasource.druid.two.max-wait=20000
...

2. 創建數據源

@Primary
@Bean
@ConfigurationProperties("spring.datasource.druid.one")
public DataSource dataSourceOne(){return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.two")
public DataSource dataSourceTwo(){return DruidDataSourceBuilder.create().build();
}

四、配置 Filter

1. 配置Filter

你可以通過 spring.datasource.druid.filters=stat,wall,log4j … 的方式來啟用相應的內置Filter,不過這些Filter都是默認配置。如果默認配置不能滿足你的需求,你可以放棄這種方式,通過配置文件來配置Filter,下面是例子。

# 配置StatFilter 
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000# 配置WallFilter 
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false# 其他 Filter 配置不再演示

2. 可配置的Filter

目前為以下 Filter 提供了配置支持,請參考文檔或者根據IDE提示(spring.datasource.druid.filter.*)進行配置。

  • StatFilter
  • WallFilter
  • ConfigFilter
  • EncodingConvertFilter
  • Slf4jLogFilter
  • Log4jFilter
  • Log4j2Filter
  • CommonsLogFilter

要想使自定義 Filter 配置生效需要將對應 Filter 的 enabled 設置為 true ,Druid Spring Boot Starter 默認禁用 StatFilter,你也可以將其 enabled 設置為 true 來啟用它。

五、獲取 Druid 的監控數據

Druid 的監控數據可以在開啟 StatFilter 后通過 DruidStatManagerFacade 進行獲取,獲取到監控數據之后你可以將其暴露給你的監控系統進行使用。Druid 默認的監控系統數據也來源于此。下面給做一個簡單的演示,在 Spring Boot 中如何通過 HTTP 接口將 Druid 監控數據以 JSON 的形式暴露出去,實際使用中你可以根據你的需要自由地對監控數據、暴露方式進行擴展。

@RestController
public class DruidStatController {@GetMapping("/druid/stat")public Object druidStat(){// DruidStatManagerFacade#getDataSourceStatDataList 該方法可以獲取所有數據源的監控數據,除此之外 DruidStatManagerFacade 還提供了一些其他方法,你可以按需選擇使用。return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();}
}
[{"Identity": 1583082378,"Name": "DataSource-1583082378","DbType": "h2","DriverClassName": "org.h2.Driver","URL": "jdbc:h2:file:./demo-db","UserName": "sa","FilterClassNames": ["com.alibaba.druid.filter.stat.StatFilter"],"WaitThreadCount": 0,"NotEmptyWaitCount": 0,"NotEmptyWaitMillis": 0,"PoolingCount": 2,"PoolingPeak": 2,"PoolingPeakTime": 1533782955104,"ActiveCount": 0,"ActivePeak": 1,"ActivePeakTime": 1533782955178,"InitialSize": 2,"MinIdle": 2,"MaxActive": 30,"QueryTimeout": 0,"TransactionQueryTimeout": 0,"LoginTimeout": 0,"ValidConnectionCheckerClassName": null,"ExceptionSorterClassName": null,"TestOnBorrow": true,"TestOnReturn": true,"TestWhileIdle": true,"DefaultAutoCommit": true,"DefaultReadOnly": null,"DefaultTransactionIsolation": null,"LogicConnectCount": 103,"LogicCloseCount": 103,"LogicConnectErrorCount": 0,"PhysicalConnectCount": 2,"PhysicalCloseCount": 0,"PhysicalConnectErrorCount": 0,"ExecuteCount": 102,"ErrorCount": 0,"CommitCount": 100,"RollbackCount": 0,"PSCacheAccessCount": 100,"PSCacheHitCount": 99,"PSCacheMissCount": 1,"StartTransactionCount": 100,"TransactionHistogram": [55,44,1,0,0,0,0],"ConnectionHoldTimeHistogram": [53,47,3,0,0,0,0,0],"RemoveAbandoned": false,"ClobOpenCount": 0,"BlobOpenCount": 0,"KeepAliveCheckCount": 0,"KeepAlive": false,"FailFast": false,"MaxWait": 1234,"MaxWaitThreadCount": -1,"PoolPreparedStatements": true,"MaxPoolPreparedStatementPerConnectionSize": 5,"MinEvictableIdleTimeMillis": 30001,"MaxEvictableIdleTimeMillis": 25200000,"LogDifferentThread": true,"RecycleErrorCount": 0,"PreparedStatementOpenCount": 1,"PreparedStatementClosedCount": 0,"UseUnfairLock": true,"InitGlobalVariants": false,"InitVariants": false}
]

六、案例

1. 問題

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

1.2.13快照版及之后的版本,都會去查找一個${project.version}的屬性導致我druid的包一直沒有下載下來,
就算切換到之前的版本自動注入也無法生效,SpringBoot3是已經確定的大版本,所以我們只能放棄對start的使用。

<parent><groupId>com.alibaba</groupId><artifactId>druid-parent</artifactId><version>1.2.23-SNAPSHOT</version><relativePath>../pom.xml</relativePath>
</parent>
<artifactId>druid-spring-boot-3-starter</artifactId>

也可能是版本問題,官方的下一個版本1.2.23-SNAPSHOT,才能匹配springboot3版本。

2. 引入庫

由于上面的問題,我們只能使用spring常規的使用方式,但是和mvc中可能會略有區別。

<properties><java.version>17</java.version><spring.version>6.1.6</spring.version><springboo.version>3.2.5</springboo.version>
</properties><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.22</version>
</dependency>

3. 配置

spring:application:name: spring-boot3#druiddatasource:#type: com.alibaba.druid.pool.DruidDataSourcedruid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=trueusername: rootpassword: 123456a?initial-size: 5max-active: 20max-wait: 60000min-idle: 3

4. 配置類

package org.example.springboot3.druid.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;/*** Create by zjg on 2024/5/19*/
@Configuration
public class DruidConfig {@Bean@ConfigurationProperties("spring.datasource.druid")public DataSource dataSource(){return new DruidDataSource();}
}

5. 測試類

package org.example.springboot3.druid.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** Create by zjg on 2024/5/19*/
@RestController
@RequestMapping("/druid/")
public class DruidController {@AutowiredDataSource dataSource;@RequestMapping("001")public String druid001() throws SQLException {Connection connection = dataSource.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select 1 from dual");String result = null;if(resultSet.next()){result=resultSet.getString(1);}statement.close();connection.close();return result;}
}

6. 測試結果

1

單獨使用最新的1.2.22版本是沒有問題的。

七、案例 ( 推薦 ) \color{#00FF00}{(推薦)} (推薦)

昨天寫了這篇文章之后,感覺沒有把最好的帶給家人們,經過一晚上的不斷閱讀諸佬的經典,總算找到了druid對springboot支持的starter,可能是阿里的哥哥們太忙了,官方文檔是一點介紹沒有啊!

1. 引入庫

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-3-starter -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.22</version>
</dependency>

2. 配置

spring:application:name: spring-boot3#druiddatasource:#type: com.alibaba.druid.pool.DruidDataSourcedruid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=trueusername: rootpassword: 123456a?initial-size: 5max-active: 20max-wait: 60000min-idle: 3

3. 測試類

package org.example.springboot3.druid.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** Create by zjg on 2024/5/19*/
@RestController
@RequestMapping("/druid/")
public class DruidController {@AutowiredDataSource dataSource;@RequestMapping("001")public String druid001() throws SQLException {Connection connection = dataSource.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select 1 from dual");String result = null;if(resultSet.next()){result=resultSet.getString(1);}statement.close();connection.close();return result;}
}

4. 測試結果

1

總結

回到頂部
源碼倉庫
中文文檔
Druid Spring Boot Starter
更多內容請參考:
【第5章】spring命名空間和數據源的引入
【第21章】spring-mvc之整合druid

推薦大家使用starter的案例。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17868.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解磁盤分區與管理:U啟、PE、DiskGenius、MBR與GUID

目錄 U啟和PE的區別: U啟(U盤啟動): PE(預安裝環境)&#xff1a; 在DiskGenius中分區完成之后是否還需要格式化&#xff1a; 1.建立文件系統&#xff1a; 2.清除數據&#xff1a; 3.檢查并修復分區&#xff1a; 分區表格式中&#xff0c;MBR和GUID的區別&#xff1a; 1…

移動端開發 筆記01

目錄 01 移動端的概述 02 移動端的視口標簽 03 開發中的二倍圖 04 流式布局 05 彈性盒子布局 01 移動端的概述 移動端包括:手機 平板 便攜式設備 目前主流的移動端開發: 安卓設備 IOS設備 只要移動端支持瀏覽器 那么就可以使用瀏覽器開發移動端項目 開發移動端 使用…

怎么看外國的短視頻:四川鑫悅里文化傳媒有限公司

怎么看外國的短視頻&#xff1a;跨文化視角下的觀察與思考 隨著全球化進程的加速和網絡技術的飛速發展&#xff0c;外國短視頻逐漸走進了我們的視野。這些來自不同文化背景、語言體系和審美觀念的短視頻作品&#xff0c;為我們打開了一扇了解世界的窗口。然而&#xff0c;如何…

golang中的md5、sha256數據加密文件md5/sha256值計算步驟和運行內存圖解

在go語言中對數據計算一個md5&#xff0c;或sha256和其他語言 如java, php中的使用方式稍有不同&#xff0c; 那就是要加密的數據必須通過流的形式寫入到你創建的Hash對象中。 Hash數據加密步驟 1. 先使用對應的加密算法包中的New函數創建一個Hash對象&#xff0c;(這個也就是…

leetCode. 85. 最大矩形

leetCode. 85. 最大矩形 部分參考上一題鏈接 leetCode.84. 柱狀圖中最大的矩形 此題思路 代碼 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每個矩形…

vue/uniapp 企業微信H5使用JS-SDK

企業微信H5需要我們使用一些SDK方法如獲取外部聯系人userid 獲取當前外部聯系人userid 使用SDK前提是如何通過config接口注入權限驗證配置 使用說明 - 接口文檔 - 企業微信開發者中心 當前項目是vue項目&#xff0c;不好直接使用 引入JS文件&#xff0c;但我們可以安裝依賴…

使用nexus搭建的docker私庫,定期清理無用的鏡像,徹底釋放磁盤空間

一、背景 我們使用nexus搭建了docker鏡像&#xff0c;隨著推送的鏡像數量越來越多&#xff0c;導致nexus服務器的磁盤空間不夠用了。于是&#xff0c;我們急需先手動刪除一些過期的鏡像&#xff0c;可發現磁盤空間并沒有釋放。 那么&#xff0c;如何才能徹底釋放掉呢&#xff…

FreeRTOS學習 -- 任務 API 函數

函數 uxTaskPriorityGet() 此函數用來查詢指定任務的優先級&#xff0c;要使用此函數的話宏 INCLUDE_uxTaskPriorityGet 應該定義為 1。 函數 vTaskPrioritySet() 此函數用于改變某一個任務的任務優先級&#xff0c;要 使 用 此 函 數 的 話 宏 INCLUDE_vTaskPrioritySet 應…

一維數組操作(GOC常考類型)答案

第1題 宇航局招聘 時限&#xff1a;1s 空間&#xff1a;256m 宇航局準備招收一批科研人員從事月球探索的航空科研工作。這個職位來了很多應聘者&#xff0c;宇航局對眾多應聘者進行綜合素質考試&#xff0c;最終會選出x名綜合得分排名靠前應聘者。目前考試已經結束了&a…

Golang | Leetcode Golang題解之第102題二叉樹的層序遍歷

題目&#xff1a; 題解&#xff1a; func levelOrder(root *TreeNode) [][]int {ret : [][]int{}if root nil {return ret}q : []*TreeNode{root}for i : 0; len(q) > 0; i {ret append(ret, []int{})p : []*TreeNode{}for j : 0; j < len(q); j {node : q[j]ret[i] …

Java面試精粹:高級問題與解答集錦(一)

Java 面試問題及答案 1. 什么是Java的垃圾回收機制&#xff0c;它如何工作&#xff1f; 答案&#xff1a; Java的垃圾回收機制是一種自動內存管理功能&#xff0c;用于回收不再被應用程序使用的對象所占用的內存。它通過垃圾收集器&#xff08;Garbage Collector&#xff0c;…

js數據類型顯隱式轉換

在JavaScript中&#xff0c;數據類型的轉換可以分為兩種主要類型&#xff1a;顯式類型轉換&#xff08;Explicit Type Conversion&#xff09;和隱式類型轉換&#xff08;Implicit Type Conversion 或 Type Coercion&#xff09;。 顯式類型轉換&#xff08;Explicit Type Con…

React18+TypeScript搭建通用中后臺項目實戰02 整合 antd 和 axios

配置路徑別名 tsconfig.json {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020","DOM","DOM.Iterable"],"module": "ESNext&quo…

磁盤分區和掛載

磁盤分區和掛載 一、磁盤 業務層面&#xff1a;滿足一定的需求所是做的特定操作 硬盤是什么以及硬盤的作用 硬盤&#xff1a;計算器的存儲設備&#xff0c;一個或者多個磁性的盤片做成&#xff0c;可以在盤片上進行數據的讀寫 連接方式&#xff1a;內部設備&#xff0c;外…

深度揭秘:藍海創意云渲染農場的五大特色功能

在當今數字化時代&#xff0c;影視制作、效果圖設計等領域對于高質量的渲染需求日益增長。在這個背景下&#xff0c;云渲染平臺成為了行業中不可或缺的一部分&#xff0c;它為用戶提供了高效、靈活的渲染解決方案。藍海創意云渲染農場https://www.vsochina.com/cn/render藍海創…

軟件需求分析和軟件原型開發是一會事情嗎?

軟件需求分析和軟件原型開發是軟件開發過程中的兩個重要環節&#xff0c;它們各自承擔著不同的任務&#xff0c;但又緊密相連&#xff0c;共同影響著軟件項目的成功。下面將詳細解釋這兩個環節的定義、目的以及它們之間的關系。 一、軟件需求分析 定義&#xff1a;軟件需求分析…

C++學習日記 | LAB 6 static library 靜態庫

資料來源&#xff1a;南科大 余仕琪 C/C Program Design LINK&#xff1a;CPP/week06 at main ShiqiYu/CPP GitHub 一、本節內容 本節主要介紹靜態庫和動態庫。 1.1 靜態庫和動態庫的概念 靜態鏈接和靜態庫(也稱為存檔)是鏈接器將所有使用的庫函數復制到可執行文件的結果。靜…

Javascript中的定時器有哪些?他們的區別及用法是什么?

JavaScript 中有幾種常用的定時器函數,它們的區別主要在于執行方式和行為: setTimeout(callback, delay):作用:在指定的延遲時間后執行回調函數一次。用法:通常用于延遲執行某些操作。返回值:一個定時器 ID,可用于取消定時器。setInterval(callback, delay):作用:每隔指定的延…

Linux中 “權限設置修改”

目錄 一、權限 &#xff08;1&#xff09;權限三大類&#xff1a; &#xff08;2&#xff09;文件的權限&#xff1a; &#xff08;3&#xff09;目錄的權限&#xff1a; &#xff08;4&#xff09;用戶的角色&#xff1a; 二、文件的權限位 三、修改用戶權限 &#xf…

【flutter 雙端開發】

flutter 雙端開發 開發小細節替換新的logo 開發小細節 替換新的logo 替換雙端logo 尋找三方插件 android 打包流程 android 打包流程2