天天看點

com.alibaba.druid

關于資料庫連接配接池

我們都知道,在使用資料庫時,基本分為三步驟。

  1. 建立資料庫連接配接。
  2. 執行sql
  3. 關閉或銷毀連接配接

但是,如果每執行一次sql都需要經過這三步的話,可以明顯看出,第1步和第2步是重複的,這樣會增加不必要的系統開銷,影響系統的效率,由此我們引進資料庫連接配接池來解決這些問題:

資料庫連接配接池通過在内部維護一定數量的資料庫連接配接,并對外暴露資料庫連接配接的擷取和傳回方法。外部使用者可通過getConnection方法擷取資料庫連接配接,使用完畢後再通過releaseConnection方法将連接配接傳回,注意此時的連接配接并沒有關閉,而是由連接配接池管理器回收,并為下一次使用做好準備,這樣就展現出了資料庫連接配接池的優點:

由于資料庫連接配接得到重用,避免了頻繁建立、釋放連接配接引起的大量性能開銷。在減少系統消耗的基礎上,增進了系統環境的平穩性(減少記憶體碎片以級資料庫臨時程序、線程的數量)
資料庫連接配接池在初始化過程中,往往已經建立了若幹資料庫連接配接置于池内備用。此時連接配接池的初始化操作均已完成。對于業務請求處理而言,直接利用現有可用連接配接,避免了資料庫連接配接初始化和釋放過程的時間開銷,進而縮減了系統整體響應時間。
在較為完備的資料庫連接配接池實作中,可根據預先的連接配接占用逾時設定,強制收回被占用的連接配接,進而避免了正常資料庫連接配接操作中可能出現的資源洩露

由上可知,資料庫連接配接池的主要功能類似于線程池,都是為了減少系統開支,提高系統的響應時間等。

Druid是什麼?

Druid是目前Java語言中比較好的資料庫連接配接池,Druid不僅提供了資料庫連接配接池的功能,同時還提供了監控資料庫狀态,慢sql記錄等比較實用的功能,幫助我們更好的操作資料庫。

spring boot項目如何內建Druid?

對于SpringBoot項目,內建Druid是比較容易的:

  1. 添加mvn依賴如下:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>{druid-version}</version>
</dependency>
           
  1. 添加如下的配置資訊(mysql為例):
# MYSQL連結(正常的資料庫連接配接屬性,不做多餘解釋)
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/XXXX
spring.datasource.druid.username=admin
spring.datasource.druid.password=123456

# 連接配接池屬性配置
#啟動程式時,在連接配接池中初始化多少個連接配接
spring.datasource.druid.initial-size=10
#連接配接池中最多支援多少個活動會話
spring.datasource.druid.max-active=20
#回收空閑連接配接時,将保證至少有minIdle個連接配接.
spring.datasource.druid.min-idle=5
#程式向連接配接池中請求連接配接時,超過maxWait的值後,認為本次請求失敗,即連接配接池沒有可用連接配接,機關毫秒,設定-1時表示無限等待
spring.datasource.druid.max-wait=60000
#緩存通過以下兩個方法發起的SQL: public PreparedStatement prepareStatement(String sql) public PreparedStatement prepareStatement(String sql,int resultSetType, int resultSetConcurrency)
spring.datasource.druid.pool-prepared-statements=false
#檢查池中的連接配接是否仍可用的 SQL 語句,drui會連接配接到資料庫執行該SQL, 如果正常傳回,則表示連接配接可用,否則表示連接配接不可用
spring.datasource.druid.validation-query=select 'x'
spring.datasource.druid.validation-query-timeout=1
#程式 申請 連接配接時,進行連接配接有效性檢查(低效,影響性能)
spring.datasource.druid.test-on-borrow=false
#程式 返還 連接配接時,進行連接配接有效性檢查(低效,影響性能)
spring.datasource.druid.test-on-return=false
#當程式請求連接配接,池在配置設定連接配接時,是否先檢查該連接配接是否有效。(高效)
spring.datasource.druid.test-while-idle=true
#檢查空閑連接配接的頻率,機關毫秒, 非正整數時表示不進行檢查
spring.datasource.druid.time-between-eviction-runs-millis=60000
#池中某個連接配接的空閑時長達到 N 毫秒後, 連接配接池在下次檢查空閑連接配接時,将回收該連接配接,要小于防火牆逾時設定
spring.datasource.druid.min-evictable-idle-time-millis=180000
spring.datasource.druid.max-evictable-idle-time-millis=300000
spring.datasource.druid.filters=stat,wall,log4j
           

3.根據需要配置Filter

# 配置StatFilter(記錄慢Sql,定義慢sql門檻值等)
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=mysql
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
spring.datasource.druid.filter.stat.merge-sql=true
spring.datasource.druid.filter.stat.connection-stack-trace-enable=true

# 配置WallFilter
(可用于防禦SQL注入攻擊等,詳細的配置說明見附錄)
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false
           

3.根據需要配置Druid内置監控頁面

(增加如下配置後,可在啟動項目後通過http://{ip}:{port}/druid/index.html通路監控頁面,使用者名密碼為下面配置的值)

spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions="*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
spring.datasource.druid.web-stat-filter.enabled=true
           

至此,Druid就已經內建到你的SpringBoot項目了。

附錄-配置 wallfilter

攔截配置-語句

配置項 預設值 描述
selelctAllow true 是否允許執行SELECT語句
selectAllColumnAllow true 是否允許執行SELECT * FROM T這樣的語句。如果設定為false,不允許執行select * from t,但select * from (select id, name from t) a。這個選項是防禦程式通過調用select *獲得資料表的結構資訊。
selectIntoAllow true SELECT查詢中是否允許INTO字句
deleteAllow true 是否允許執行DELETE語句
updateAllow true 是否允許執行UPDATE語句
insertAllow true 是否允許執行INSERT語句
replaceAllow true 是否允許執行REPLACE語句
mergeAllow true 是否允許執行MERGE語句,這個隻在Oracle中有用
callAllow true 是否允許通過jdbc的call文法調用存儲過程
setAllow true 是否允許使用SET文法
truncateAllow true truncate語句是危險,預設打開,若需要自行關閉
createTableAllow true 是否允許建立表
alterTableAllow true 是否允許執行Alter Table語句
dropTableAllow true 是否允許修改表
commentAllow false 是否允許語句中存在注釋,Oracle的使用者不用擔心,Wall能夠識别hints和注釋的差別
noneBaseStatementAllow false 是否允許非以上基本語句的其他語句,預設關閉,通過這個選項就能夠屏蔽DDL
multiStatementAllow false 是否允許一次執行多條語句,預設關閉
useAllow true 是否允許執行mysql的use語句,預設打開
describeAllow true 是否允許執行mysql的describe語句,預設打開
showAllow true 是否允許執行mysql的show語句,預設打開
commitAllow true 是否允許執行commit操作
rollbackAllow true 是否允許執行roll back操作

如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都設定為false,這就是一個隻讀資料源了

WallFilter配置說明

配置項 預設值 描述
logViolation false 對被認為是攻擊的SQL進行LOG.error輸出
throwException true 對被認為是攻擊的SQL抛出SQLException

剛開始引入WallFilter的時候,把logViolation設定為true,而throwException設定為false。就可以觀察是否存在違規的情況,同時不影響業務運作。

參考連結:點選這裡