1. 程式人生 > 資料庫 >【SpringBoot 2學習筆記】《九》SpringBoot2資料庫訪問之Druid連線池

【SpringBoot 2學習筆記】《九》SpringBoot2資料庫訪問之Druid連線池

為什麼要使用資料庫連線池

不使用資料庫連線池: 對於併發量大的網站,會導致以下問題:

  • 每一次web請求都要建立一次資料庫連線,在同樣的步驟下重複佔用系統資源
  • 不能控制被建立的連線物件數,系統資源會被毫無顧及的分配出去,連線過多情況下可能導致記憶體洩漏,伺服器崩潰。

使用資料庫連線池:

  • 提高效能,將已經建立好的連線儲存在連線池中,當有請求來時,直接從連線池中使用已經建立好的連線進行資料庫伺服器的訪問。省略了建立連線和銷燬連線的過程,TCP連線建立時的三次握手和銷燬時的四次握手。
  • 囂張的Druid(GitHub的Wiki上自稱是Java語言最好的資料庫連線池)。Druid連線池是阿里巴巴開源的資料庫連線池專案。Druid連線池為監控而生,內建強大的監控功能,監控特性不影響效能。功能強大,能防SQL注入,內建Loging能診斷Hack應用行為。經過阿里內部數千上萬的系統大規模驗證,經過歷年雙十一超大規模併發驗證。

9.1 配置專案POM檔案

加入Druid的依賴

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

9.2 配置資料庫連線池application.properties

Druid必須的配置其實很少,只需配置一行,表明不使用預設的Hikari。引數調優部分是可選的,這裡列出的引數都是druid官網推薦的典型配置。

# druid配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# druid引數調優(可選)
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置獲取連線等待超時的時間
spring.datasource.druid.max-wait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一個連線在池中最小生存的時間,單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 測試連線
spring.datasource.druid.validation-query=select 'x'
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# 開啟PSCache,並且指定每個連線上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置監控統計攔截的filters
spring.datasource.druid.filters=stat
# asyncInit是1.1.4中新增加的配置,如果有initialSize數量較多時,開啟會加快應用啟動時間
spring.datasource.druid.async-init=true


9.3 開啟Druid監控配置

Druid的監控配置可以通過在配置檔案中通過配置方式,也可以通過建立配置類(DruidConfiguration)的方式,下面的例子是使用配置檔案方式。

# 進行Druid的監控配置
# Druid內建提供一個StatFilter,用於統計監控資訊(https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter)
# 啟用StatFilter
spring.datasource.druid.web-stat-filter.enabled=true
# StatFilter過濾匹配
spring.datasource.druid.web-stat-filter.url-pattern=/* 
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
# 預設sessionStatMaxCount是1000個。你可以按需要進行配置
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000 
# 關閉session統計功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true 
# 配置profileEnable能夠監控單個url呼叫的sql列表
spring.datasource.druid.web-stat-filter.profile-enable=true 


# StatViewServlet配置,內建監控頁面配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 禁用HTML頁面上的“Reset All”功能
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 監控頁面使用者名稱和密碼
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
# IP白名單 (沒有配置或者為空,則允許所有訪問)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# IP黑名單 (存在共同時,deny優先於allow)
spring.datasource.druid.stat-view-servlet.deny=192.168.10.1


## Spring監控配置
# Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
spring.datasource.druid.aop-patterns=com.gavinbj.confmng.service.*
# 配置wall filter,詳細參考:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
spring.datasource.druid.filter.wall.enabled=true
# 資料庫指定為MySQL
spring.datasource.druid.filter.wall.db-type=mysql
# 是否允許執行Alter Table語句
spring.datasource.druid.filter.wall.config.alter-table-allow=false
# truncate語句是危險,預設開啟,若需要自行關閉
spring.datasource.druid.filter.wall.config.truncate-allow=false
# 是否循序執行刪除表語句
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# 是否允許非以上基本語句的其他語句,預設關閉,通過這個選項就能夠遮蔽DDL
spring.datasource.druid.filter.wall.config.none-base-statement-allow=false
# 檢查UPDATE語句的WHERE子句是否是一個永真條件
spring.datasource.druid.filter.wall.config.update-where-none-check=true
# 是否允許呼叫Connection.getMetadata方法,這個方法呼叫會暴露資料庫的表資訊
spring.datasource.druid.filter.wall.config.metadata-allow=true
# 對被認為是攻擊的SQL進行LOG.error輸出
spring.datasource.druid.filter.wall.log-violation=true
# 對被認為是攻擊的SQL丟擲SQLExcepton
spring.datasource.druid.filter.wall.throw-exception=true

9.4 整合結果確認

通過如上配置,即完成了Druid的整合,同時開啟了Druid的監控中心。我們接下來驗證一下:

啟動工程,訪問:http://localhost:9002/gavin/api/user/users/gavin

返回結果:

{
	"status": 0,"code": 1003,"msg": "處理成功!","data": {
		"userId": "gavin","userName": "蓋文","introduce": "大學教授","mobilephone": "13940981276","email": "[email protected]","birthday": "2019-10-07T00:00:00.000+0000","gender": "男"
	}
}

開啟Druid的監控頁面:http://localhost:9002/gavin/druid/login.html

注意:賬號:admin , 密碼:admin 賬號密碼可以在application.properties 中修改。

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

在這裡插入圖片描述