1. 程式人生 > >spring boot 學習筆記 (10) Spring Boot 整合 Druid 監控資料來源

spring boot 學習筆記 (10) Spring Boot 整合 Druid 監控資料來源

Druid 是阿里巴巴開源平臺上的一個專案,整個專案由資料庫連線池、外掛框架和 SQL 解析器組成,該專案主要是為了擴充套件 JDBC 的一些限制,可以讓程式設計師實現一些特殊的需求,比如向金鑰服務請求憑證、統計 SQL 資訊、SQL 效能收集、SQL 注入檢查、SQL 翻譯等,程式設計師可以通過定製來實現自己需要的功能。

Druid 首先是一個數據庫連線池,但它不僅僅是一個數據庫連線池,還包含了一個 ProxyDriver,一系列內建的 JDBC 元件庫,一個 SQL Parser。在 Java 的世界中 Druid 是監控做的最好的資料庫連線池,在功能、效能、擴充套件性方面,也有不錯的表現。

Druid 可以做什麼

  • 替換其他 Java 連線池,Druid 提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。
  • 可以監控資料庫訪問效能,Druid 內建提供了一個功能強大的 StatFilter 外掛,能夠詳細統計 SQL 的執行效能,這對於線上分析資料庫訪問效能有很大幫助。
  • 資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題,DruidDruiver 和 DruidDataSource 都支援 PasswordCallback。
  • SQL 執行日誌,Druid 提供了不同的 LogFilter,能夠支援 Common-Logging、Log4j 和 JdkLog,可以按需要選擇相應的 LogFilter,監控應用的資料庫訪問情況。
  • 擴充套件 JDBC,如果你要對 JDBC 層有程式設計的需求,可以通過 Druid 提供的 Filter 機制,很方便編寫 JDBC 層的擴充套件外掛。

Spring Boot 整合 Druid

非常令人高興的是,阿里為 Druid 也提供了 Spring Boot Starter 的支援。官網這樣解釋:Druid Spring Boot Starter 用於幫助你在 Spring Boot 專案中輕鬆整合 Druid 資料庫連線池和監控。

Druid Spring Boot Starter 主要做了哪些事情呢?其實這個元件包很簡單,主要提供了很多自動化的配置,按照 Spring Boot 的理念對很多內容進行了預配置,讓我們在使用的時候更加的簡單和方便

 

  • 配置引數

和其它連線池一樣DRUID的DataSource類為:com.alibaba.druid.pool.DruidDataSource,基本配置引數如下:

 

配置 預設值 說明
name   配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。 
如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this)
jdbcUrl   連線資料庫的url,不同資料庫不一樣。例如: 
mysql : jdbc:mysql://10.20.153.104:3306/druid2 
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username   連線資料庫的使用者名稱
password   連線資料庫的密碼。如果你不希望密碼直接寫在配置檔案中,可以使用ConfigFilter。詳細看這裡:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
driverClassName 根據url自動識別 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然後選擇相應的driverClassName(建議配置下)
initialSize 0 初始化時建立物理連線的個數。初始化發生在顯示呼叫init方法,或者第一次getConnection時
maxActive 8 最大連線池數量
maxIdle 8 已經不再使用,配置了也沒效果
minIdle   最小連線池數量
maxWait   獲取連線時最大等待時間,單位毫秒。配置了maxWait之後,預設啟用公平鎖,併發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedStatements false 是否快取preparedStatement,也就是PSCache。PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。在mysql下建議關閉。
maxOpenPreparedStatements -1 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache佔用記憶體過多的問題,可以把這個數值配置大一些,比如說100
validationQuery   用來檢測連線是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。
testOnBorrow true 申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能。
testOnReturn false 歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能
testWhileIdle false 建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。
timeBetweenEvictionRunsMillis   有兩個含義: 
1) Destroy執行緒會檢測連線的間隔時間2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
numTestsPerEvictionRun   不再使用,一個DruidDataSource只支援一個EvictionRun
minEvictableIdleTimeMillis    
connectionInitSqls   物理連線初始化的時候執行的sql
exceptionSorter 根據dbType自動識別 當資料庫丟擲一些不可恢復的異常時,拋棄連線
filters   屬性型別是字串,通過別名的方式配置擴充套件外掛,常用的外掛有: 
監控統計用的filter:stat日誌用的filter:log4j防禦sql注入的filter:wall
proxyFilters  

型別是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關係,並非替換關係

 

 

 

MyBatis 中使用 Druid 作為連線池

在前面課程中的 spring-boot-mybatis-annotation 上去整合。

引入依賴包

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>
  • druid-spring-boot-starter 的最新版本為 1.1.10,會自動依賴 Druid 相關包。

application 配置

Druid Spring Boot Starter 配置屬性的名稱完全遵照 Druid,可以通過 Spring Boot 配置檔案來配置 Druid 資料庫連線池和監控,如果沒有配置則使用預設值。

# 實體類包路徑
mybatis.type-aliases-package=com.neo.model

spring.datasource.type: com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 初始化大小、最小、最大連線數
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10

# 配置獲取連線等待超時的時間
spring.datasource.druid.max-wait=60000

# 監控後臺賬號和密碼
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

在以前專案的基礎上,增加了對 Druid 連線池的配置,以及 SQL 監控的配置,druid-spring-boot-starter 預設情況下開啟 StatFilter 的監控功能。Druid Spring Boot Starter 不限於對以上配置屬性提供支援,DruidDataSource 內提供 setter 方法的可配置屬性都將被支援。

更多配置內容請參考 druid-spring-boot-starter

配置完成後,直接啟動專案訪問地址:http://localhost:8080/druid,就會出現 Druid 監控後臺的登入頁面,輸入賬戶和密碼後,就會進入首頁。

首頁會展示專案使用的 JDK 版本、資料庫驅動、JVM 相關統計資訊。根據上面的選單可以看出 Druid 的功能非常強大,支援資料來源、SQL 監控、SQL 防火牆、URI 監控等很多功能。

 SQL 監控,具體的展示資訊如下:

這裡的 SQL 監控會將專案中具體執行的 SQL 打印出來,展示此 SQL 執行了多少次、每次返回多少資料、執行的時間分佈是什麼。這些功能非常的實用,方便我們在實際生產中查找出慢 SQL,最後對 SQL 進行調優。

從這個例子可發現,使用 Spring Boot 整合 Druid 非常的簡單,只需要新增依賴,簡單配置就可以。

 

Spring Data JPA 中使用 Druid 作為連線池

Spring Data JPA 整合 Druid 的方式和 MyBatis 大體相同。

引入相關依賴包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>

新增 Web 依賴是因為需要在啟動的時候保持容器執行,同時在專案中添加了 Web 訪問,內容如下:

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @RequestMapping("/getUsers")
    public List<User> getUsers() {
        List<User> users=userRepository.findAll();
        return users;
    }
}

內容比較簡單獲取所有的使用者資訊並展示出來。

Application 中新增以下資訊:

# 初始化大小、最小、最大連結數
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10

# 配置獲取連線等待超時的時間
spring.datasource.druid.max-wait=60000

#  StatViewServlet 配置
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

好了,這樣就成功的在 JPA 專案中配置好了 Druid 的使用。啟動專案先訪問地址:http://localhost:8080/getUsers,再訪問 http://localhost:8080/druid,檢視 SQL 執行記錄,如下:

會發現有 create table addres... 和 drop table if exist... 這樣的 SQL 語句,這是因為我們將 JPA 的策略設定為 create,spring.jpa.properties.hibernate.hbm2ddl.auto=create,意味著每次重啟的時候對會重新建立表,方便我們在測試的時候使用。

 

 

因為 Druid 官方還沒有針對 Spring Boot 2.0 進行優化,在某些場景下使用就會出現問題,比如在 JPA 多資料來源的情況下直接使用 Druid 提供的 druid-spring-boot-starter 就會報錯,既然 druid-spring-boot-starter 不支援,需要使用 Druid 的原生包進行封裝。