數據庫連接池
連接池的思想就是建立一個"緩存池",預先存放一定數量的連接,當需要建立數據庫連接時,就從"緩存池"中取出一個,用完之後再放入池中。
連接池是怎麼管理、分配連接對象呢?
使用一個"空閒池"管理已經被創建但未被使用的連接,當有一個新的連接請求時,首先再"空閒池"中尋找空閒的連接對象,如果池中有空閒連接對象,就把空閒時間最長的那個連接對象取出來分配(前提是這個對象是有效的),如果這個對象不可用,就將其從"空閒池"中刪除,重新檢測。如果沒有檢測到可用連接,則判斷當前連接數是否達到最大連接數,如果沒有,則創建新的連接,如果達到最大連接數,則進入等待。如果在等待的時間內,檢測到可用的連接,則進行分配,如果超時還未檢測到可用連接,則返回null。系統只對所創建的連接進行計數統計,對於檢測可用連接,可開闢線程(提示響應速度,增加系統開銷)、也可在分配前進行檢測。
Druid
Durid是阿里開源的JDBC應用組件,包括三部分:
- DruidDriver:代理Driver,能提供基於Filter-Chian模式的插件系統
- DruidDataoSource:高效可管理的數據庫連接池
- SQLParser:SQL語法分析
通過Druid連接池中間件,可以實現:
- 可監控的數據庫訪問的性能,Druid提供了一個強大的StatFilter插件,能詳細的統計SQL執行性能,對於線上分析數據庫訪問性能非常有利
- 替換傳統的DBCP和C3P0中間件。提供一個高效、功能強大、可監控的數據庫連接池
- 數據庫密碼加密。直接把數據庫密碼寫入配置文件中,會存在極大的安全問題,DruidDriver和DruidDataSource都支持PasswordCallBack。
- SQL執行日誌。Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和jdkLog,可按需選擇日誌框架
- 擴展JDBC。如果對JDBC層有編程需求、可通過Druid提供的Filter-Chain機制,方便編寫JDBC擴展插件
案例
pom.xml中添加依賴
<!--Druid依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
修改數據源配置
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.8:3306/studenms?useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&autoReconnect=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: sa
filters: stat,wall,log4j,config
max-active: 100
initial-size: 1
max-wait: 60000
min-idle: 1
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 30000
validation-query: select 'X'
test-while-idle: true
test-on-borrow: false
test-on-return: false
max-pool-prepared-statement-per-connection-size: 20
max-open-prepared-statements: 50
# 配置監控服務器
stat-view-servlet:
# 這裏一定要配置true,不配置則是使用默認值false,空白頁面
enabled: true
login-username: root
login-password: sa
reset-enable: false
url-pattern: /druid/*
參數說明:
- max-active:最大連接數
- initial-size: 初始化連接數
- min-idle:最小連接數
- max-wait:等待最長時間
- time-between-eviction-runs-millis:間隔多久檢測一次
- min-evictable-idle-time-millis:一個連接池最小的生存時間
- filters: stat,wall,log4j,config,配置監控統計攔截的filers,如果沒有,則監控界面無法統計,‘wall’用於防火牆
Druid提供以下幾種Filter
Druid-spring-boot-starter簡化了一些配置,如果需要自定義配置,參考Druid-spring-boot-starte自定義配置
測試
瀏覽器輸入localhost:8090/druid,會自動跳轉到登錄界面
輸入監控服務配置中的login-username和login-password,進入控制檯頁面
測試接口
執行分頁查詢的接口
進入控制檯,查看SQL監控。
從SQL監控發現,執行了2條SQL。調用一個接口,執行了2條SQL,這是爲什麼?
答:剛纔說到這是分頁查詢接口,使用mybatis分頁查詢時,要寫2條SQL,一條查詢Count(*),一條是分頁查詢。由於接口使用了pagehelper插件,它簡化了mybatis的sql,開發者只用寫一條查詢所有數據的SQL,它會自動攔截,進行分頁,因此實際上是執行了2條SQL。
同時從圖中還發現發現,執行select count(*)語句耗時14毫秒,druid給出了"最慢"提示。實際上這張表只有3行,7個字段。由此可見select count()要慎用。
還可以看到url的監控,具體執行了哪些api接口,這裏都可以查看
問題
1.出現如下錯誤信息,是缺少log4j依賴,在pom.xml引入依賴,即可
- druid監控頁面空白
檢查stat-view-servlet監控服務配置是否開啓,將enable設置爲true