關于資料庫連接配接池
我們都知道,在使用資料庫時,基本分為三步驟。
- 建立資料庫連接配接。
- 執行sql
- 關閉或銷毀連接配接
但是,如果每執行一次sql都需要經過這三步的話,可以明顯看出,第1步和第2步是重複的,這樣會增加不必要的系統開銷,影響系統的效率,由此我們引進資料庫連接配接池來解決這些問題:
資料庫連接配接池通過在内部維護一定數量的資料庫連接配接,并對外暴露資料庫連接配接的擷取和傳回方法。外部使用者可通過getConnection方法擷取資料庫連接配接,使用完畢後再通過releaseConnection方法将連接配接傳回,注意此時的連接配接并沒有關閉,而是由連接配接池管理器回收,并為下一次使用做好準備,這樣就展現出了資料庫連接配接池的優點:
由于資料庫連接配接得到重用,避免了頻繁建立、釋放連接配接引起的大量性能開銷。在減少系統消耗的基礎上,增進了系統環境的平穩性(減少記憶體碎片以級資料庫臨時程序、線程的數量)
資料庫連接配接池在初始化過程中,往往已經建立了若幹資料庫連接配接置于池内備用。此時連接配接池的初始化操作均已完成。對于業務請求處理而言,直接利用現有可用連接配接,避免了資料庫連接配接初始化和釋放過程的時間開銷,進而縮減了系統整體響應時間。
在較為完備的資料庫連接配接池實作中,可根據預先的連接配接占用逾時設定,強制收回被占用的連接配接,進而避免了正常資料庫連接配接操作中可能出現的資源洩露
由上可知,資料庫連接配接池的主要功能類似于線程池,都是為了減少系統開支,提高系統的響應時間等。
Druid是什麼?
Druid是目前Java語言中比較好的資料庫連接配接池,Druid不僅提供了資料庫連接配接池的功能,同時還提供了監控資料庫狀态,慢sql記錄等比較實用的功能,幫助我們更好的操作資料庫。
spring boot項目如何內建Druid?
對于SpringBoot項目,內建Druid是比較容易的:
- 添加mvn依賴如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>{druid-version}</version>
</dependency>
- 添加如下的配置資訊(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。就可以觀察是否存在違規的情況,同時不影響業務運作。
參考連結:點選這裡