Spring Boot 2.x基礎教程:使用國產資料庫連接池Druid

碼農看看 發佈 2020-02-10T13:01:24+00:00

上一篇SpringBoot 2.x基礎教程:默認數據源Hikari的配置詳解,我們介紹了Spring Boot在JDBC模塊中自動化配置使用的默認數據源HikariCP。

上一篇Spring Boot 2.x基礎教程:默認數據源Hikari的配置詳解,我們介紹了Spring Boot在JDBC模塊中自動化配置使用的默認數據源HikariCP。接下來這一節,我們將介紹另外一個被廣泛應用的開源數據源:Druid。

https://github.com/alibaba/druid是由阿里巴巴資料庫事業部出品的開源項目。它除了是一個高性能資料庫連接池之外,更是一個自帶監控的資料庫連接池。雖然HikariCP已經很優秀,但是對於國內用戶來說,可能對於Druid更為熟悉。所以,對於如何在Spring Boot中使用Druid是後端開發人員必須要掌握的基本技能。

配置Druid數據源

這一節的實踐我們將基於http://blog.didispace.com/spring-boot-learning-21-3-1一文的代碼基礎上進行。所以,讀者可以從文末的代碼倉庫中,檢出chapter3-1目錄來進行下面的實踐學習。

下面我們就來開始對Spring Boot項目配置Druid數據源:

第一步:在pom.xml中引入druid官方提供的Spring Boot Starter封裝。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

第二步:在application.properties中配置資料庫連接信息。

Druid的配置都以spring.datasource.druid作為前綴,所以根據之前的配置,稍作修改即可:

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

第三步:配置Druid的連接池。

與Hikari一樣,要用好一個數據源,就要對其連接池做好相應的配置,比如下面這樣:

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

到這一步,就已經完成了將Spring Boot的默認數據源HikariCP切換到Druid的所有操作。更多關於Druid的配置說明可點擊底部擴展連結。

配置Druid監控

既然用了Druid,那麼對於Druid的監控功能怎麼能不用一下呢?下面就來再進一步做一些配置,來啟用Druid的監控。

第一步:在pom.xml中引入spring-boot-starter-actuator模塊

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第二步:在application.properties中添加Druid的監控配置。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

上面的配置主要用於開啟stat監控統計的介面以及監控內容的相關配置,具體釋意如下:

  • 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:監控頁面的登錄密碼

第三步:針對之前實現的UserService內容,我們創建一個Controller來通過接口去調用數據訪問操作:

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

第四步:完成上面所有配置之後,啟動應用,訪問Druid的監控頁面http://localhost:8080/druid/,可以看到如下登錄頁面:

輸入上面spring.datasource.druid.stat-view-servlet.login-username和spring.datasource.druid.stat-view-servlet.login-password配置的登錄帳戶與密碼,就能看到如下監控頁面:

進入到這邊時候,就可以看到對於應用端而言的各種監控數據了。這裡講解幾個最為常用的監控頁面:

數據源:這裡可以看到之前我們配置的資料庫連接池信息以及當前使用情況的各種指標。

SQL監控:該數據源中執行的SQL語句極其統計數據。在這個頁面上,我們可以很方便的看到當前這個Spring Boot都執行過哪些SQL,這些SQL的執行頻率和執行效率也都可以清晰的看到。如果你這裡沒看到什麼數據?別忘了我們之前創建了一個Controller,用這些接口可以觸發UserService對資料庫的操作。所以,這裡我們可以通過調用接口的方式去觸發一些操作,這樣SQL監控頁面就會產生一些數據:

圖中監控項上,執行時間、讀取行數、更新行數都通過區間分布的方式表示,將耗時分布成8個區間:

  • 0 - 1 耗時0到1毫秒的次數
  • 1 - 10 耗時1到10毫秒的次數
  • 10 - 100 耗時10到100毫秒的次數
  • 100 - 1,000 耗時100到1000毫秒的次數
  • 1,000 - 10,000 耗時1到10秒的次數
  • 10,000 - 100,000 耗時10到100秒的次數
  • 100,000 - 1,000,000 耗時100到1000秒的次數
  • 1,000,000 - 耗時1000秒以上的次數

記錄耗時區間的發生次數,通過區分分布,可以很方便看出SQL運行的極好、普通和極差的分布。 耗時區分分布提供了「執行+RS時分布」,是將執行時間+ResultSet持有時間合併監控,這個能方便診斷返回行數過多的查詢。

SQL防火牆:該頁面記錄了與SQL監控不同維度的監控數據,更多用於對表訪問維度、SQL防禦維度的統計。

https://tva1.sinaimg.cn/large/0082zybpgy1gbp98krgmkj310s0u047t.jpg](http://blog.didispace.com/images/pasted-314.png)

該功能數據記錄的統計需要在spring.datasource.druid.filters中增加wall屬性才會進行記錄統計,比如這樣:

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

注意:這裡的所有監控信息是對這個應用實例的數據源而言的,而並不是資料庫全局層面的,可以視為應用層的監控,不可能作為中間件層的監控。

代碼示例

本文的相關例子可以查看下面倉庫中的chapter3-3目錄:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/master/2.1.x
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/master/2.1.x

如果您覺得本文不錯,歡迎Star支持,您的關注是我堅持的動力!

關鍵字: