【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 中修改。

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章