$cfg_dbtype = mysql_Druid连接池二(学习笔记)
6.Druid關聯
6.1.Web關聯監控配置
WebStatFilter用于采集web-jdbc關聯監控的數據。
web.xml配置:
DruidWebStatFiltercom.alibaba.druid.support.http.WebStatFilterexclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*DruidWebStatFilter/*
exlusions配置
經常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。比如:
exclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
sessionStatMaxCount配置
缺省sessionStatMaxCount是1000個。你可以按需要進行配置,比如:
sessionStatMaxCount1000
sessionStatEnable配置
你可以關閉session統計功能,比如:
sessionStatEnablefalse
principalSessionName配置
你可以配置principalSessionName,使得druid能夠知道當前的session的用戶是誰。比如:
principalSessionNamexxx.user
根據需要,把其中的xxx.user修改為你user信息保存在session中的sessionName。
注意:如果你session中保存的是非string類型的對象,需要重載toString方法。
principalCookieName
如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當前的user是誰
principalCookieNamexxx.user
根據需要,把其中的xxx.user修改為你user信息保存在cookie中的cookieName
profileEnable
druid?0.2.7版本開始支持profile,配置profileEnable能夠監控單個url調用的sql列表。
profileEnabletrue
結果展示
6.2.Spring關聯監控配置
Druid提供了Spring和Jdbc的關聯監控。
配置spring
com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一個標準的Spring?MethodInterceptor。可以靈活進行AOP配置。
Spring?AOP的配置文檔:
按類型攔截配置
druid-stat-interceptor
方法名正則匹配攔截配置
com.mycompany.service.*com.mycompany.dao.*
有些情況下,可能你需要配置proxy-target-class,例如
按照BeanId來攔截配置
xxx-daoxxx-servicedruid-stat-interceptor
6.Druid防御
Druid提供了WallFilter,它是基于SQL語義分析來實現防御SQL注入攻擊的。
這個文檔提供基于Spring的各種配置方式。
使用缺省配置的WallFilter
...
結合其他Filter一起使用
WallFilter可以結合其他Filter一起使用,例如:
...
這樣,攔截檢測的時間不在StatFilter統計的SQL執行時間內。
如果希望StatFilter統計的SQL執行時間內,則使用如下配置:
...
指定dbType
有時候,一些應用框架做了自己的JDBC?Proxy?Driver,是的DruidDataSource無法正確識別數據庫的類型,則需要特別指定,如下:
...
指定配置裝載的目錄
缺省情況下,配置裝載的目錄如下:
數據庫類型
目錄
mysql
META-INF/druid/wall/mysql
oracle
META-INF/druid/wall/oracle
sqlserver
META-INF/druid/wall/sqlserver
postgres
META-INF/druid/wall/postgres
從配置目錄中以下文件中讀取配置:
deny-variant.txtdeny-schema.txtdeny-function.txtdeny-table.txtdeny-object.txt
指定配置裝載的目錄是可以指定,例如:
...
WallConfig詳細說明
本身的配置
配置項
缺省值
dir
按照dbType分別配置:
mysql?:?META-INF/druid/wall/mysql
oracle?:?META-INF/druid/wall/oracle
sqlserver?:?META-INF/druid/wall/sqlserver
攔截配置-語句
配置項
缺省值
描述
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,這就是一個只讀數據源了。
攔截配置-永真條件
配置項
缺省值
描述
selectWhereAlwayTrueCheck
true
檢查SELECT語句的WHERE子句是否是一個永真條件
selectHavingAlwayTrueCheck
true
檢查SELECT語句的HAVING子句是否是一個永真條件
deleteWhereAlwayTrueCheck
true
檢查DELETE語句的WHERE子句是否是一個永真條件
deleteWhereNoneCheck
false
檢查DELETE語句是否無where條件,這是有風險的,但不是SQL注入類型的風險
updateWhereAlayTrueCheck
true
檢查UPDATE語句的WHERE子句是否是一個永真條件
updateWhereNoneCheck
false
檢查UPDATE語句是否無where條件,這是有風險的,但不是SQL注入類型的風險
conditionAndAlwayTrueAllow
false
檢查查詢條件(WHERE/HAVING子句)中是否包含AND永真條件
conditionAndAlwayFalseAllow
false
檢查查詢條件(WHERE/HAVING子句)中是否包含AND永假條件
conditionLikeTrueAllow
true
檢查查詢條件(WHERE/HAVING子句)中是否包含LIKE永真條件
其他攔截配置
配置項
缺省值
描述
selectIntoOutfileAllow
false
SELECT?...?INTO?OUTFILE?是否允許,這個是mysql注入攻擊的常見手段,缺省是禁止的
selectUnionCheck
true
檢測SELECT?UNION
selectMinusCheck
true
檢測SELECT?MINUS
selectExceptCheck
true
檢測SELECT?EXCEPT
selectIntersectCheck
true
檢測SELECT?INTERSECT
mustParameterized
false
是否必須參數化,如果為True,則不允許類似WHERE?ID?=?1這種不參數化的SQL
strictSyntaxCheck
true
是否進行嚴格的語法檢測,Druid?SQL?Parser在某些場景不能覆蓋所有的SQL語法,出現解析SQL出錯,可以臨時把這個選項設置為false,同時把SQL反饋給Druid的開發者。
conditionOpXorAllow
false
查詢條件中是否允許有XOR條件。XOR不常用,很難判斷永真或者永假,缺省不允許。
conditionOpBitwseAllow
true
查詢條件中是否允許有"&"、"~"、"|"、"^"運算符。
conditionDoubleConstAllow
false
查詢條件中是否允許連續兩個常量運算表達式
minusAllow
true
是否允許SELECT?*?FROM?A?MINUS?SELECT?*?FROM?B這樣的語句
intersectAllow
true
是否允許SELECT?*?FROM?A?INTERSECT?SELECT?*?FROM?B這樣的語句
constArithmeticAllow
true
攔截常量運算的條件,比如說WHERE?FID?=?3?-?1,其中"3?-?1"是常量運算表達式。
limitZeroAllow
false
是否允許limit?0這樣的語句
禁用對象檢測配置
配置項
缺省值
描述
tableCheck
true
檢測是否使用了禁用的表
schemaCheck
true
檢測是否使用了禁用的Schema
functionCheck
true
檢測是否使用了禁用的函數
objectCheck
true
檢測是否使用了“禁用對對象”
variantCheck
true
檢測是否使用了“禁用的變量”
readOnlyTables
空
指定的表只讀,不能夠在SELECT?INTO、DELETE、UPDATE、INSERT、MERGE中作為"被修改表"出現
Jdbc相關配置
配置項
缺省值
描述
metadataAllow
true
是否允許調用Connection.getMetadata方法,這個方法調用會暴露數據庫的表信息
wrapAllow
true
是否允許調用Connection/Statement/ResultSet的isWrapFor和unwrap方法,這兩個方法調用,使得有辦法拿到原生驅動的對象,繞過WallFilter的檢測直接執行SQL。
WallFiler配置說明
配置項
缺省值
描述
logViolation
false
對被認為是攻擊的SQL進行LOG.error輸出
throwException
true
對被認為是攻擊的SQL拋出SQLExcepton
config
provider
剛開始引入WallFilter的時候,把logViolation設置為true,而throwException設置為false。就可以觀察是否存在違規的情況,同時不影響業務運行。
7.Druid參考
不同的業務場景需求不同,你可以使用我們的參考配置,但建議你仔細閱讀相關文檔,了解清楚之后做定制配置。
以下是一個參考的連接池配置:
通常來說,只需要修改initialSize、minIdle、maxActive。
如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫分表較多的數據庫,建議配置為false。
9.?Druid日志
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里:
Druid內置提供了三種LogFilter(Log4jFilter、CommonsLogFilter、Slf4jLogFilter),用于輸出JDBC執行的日志。這些Filter都是Filter-Chain擴展機制中的Filter,所以配置方式可以參考這里:Filter配置
1.?別名映射
在druid-xxx.jar!/META-INF/druid-filter.properties文件中描述了這三種Filter的別名
druid.filters.log4j=com.alibaba.druid.filter.logging.Log4jFilterdruid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilterdruid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilterdruid.filters.commonLogging=com.alibaba.druid.filter.logging.CommonsLogFilter
他們的別名分別是log4j、slf4j、commonlogging和commonLogging。其中commonlogging和commonLogging只是大小寫不同。
...?...
2.?loggerName配置
LogFilter都是缺省使用四種不同的Logger執行輸出,看實現代碼:
public?abstract?class?LogFilter?{protected?String??????????dataSourceLoggerName?????????????????=?"druid.sql.DataSource";protected?String??????????connectionLoggerName?????????????????=?"druid.sql.Connection";protected?String??????????statementLoggerName??????????????????=?"druid.sql.Statement";protected?String??????????resultSetLoggerName??????????????????=?"druid.sql.ResultSet";}
你可以根據你的需要修改,在log4j.properties文件上做配置時,注意配置使用相關的logger。
3.?配置輸出日志
缺省輸入的日志信息全面,但是內容比較多,有時候我們需要定制化配置日志輸出。
...
參數
說明
dataSourceLogEnabled
所有DataSource相關的日志
connectionLogEnabled
所有連接相關的日志
connectionLogErrorEnabled
所有連接上發生異常的日志
statementLogEnabled
所有Statement相關的日志
statementLogErrorEnabled
所有Statement發生異常的日志
resultSetLogEnabled
resultSetLogErrorEnabled
connectionConnectBeforeLogEnabled
connectionConnectAfterLogEnabled
connectionCommitAfterLogEnabled
connectionRollbackAfterLogEnabled
connectionCloseAfterLogEnabled
statementCreateAfterLogEnabled
statementPrepareAfterLogEnabled
statementPrepareCallAfterLogEnabled
statementExecuteAfterLogEnabled
statementExecuteQueryAfterLogEnabled
statementExecuteUpdateAfterLogEnabled
statementExecuteBatchAfterLogEnabled
statementCloseAfterLogEnabled
statementParameterSetLogEnabled
resultSetNextAfterLogEnabled
resultSetOpenAfterLogEnabled
resultSetCloseAfterLogEnabled
4.?log4j.properties配置
如果你使用log4j,可以通過log4j.properties文件配置日志輸出選項,例如:
log4j.logger.druid.sql=warn,stdoutlog4j.logger.druid.sql.DataSource=warn,stdoutlog4j.logger.druid.sql.Connection=warn,stdoutlog4j.logger.druid.sql.Statement=warn,stdoutlog4j.logger.druid.sql.ResultSet=warn,stdout
5.?輸出可執行的SQL
Java啟動參數配置方式
-Ddruid.log.stmt.executableSql=true
logFilter參數直接配置
10.Druid泄露
Druid提供了多種監測連接泄漏的手段
連接泄漏監測
當程序存在缺陷時,申請的連接忘記關閉,這時候,就存在連接泄漏了。Druid提供了RemoveAbandanded相關配置,用來關閉長時間不使用的連接。例如:
配置
...?...???...?...
配置removeAbandoned對性能會有一些影響,建議懷疑存在泄漏之后再打開。在上面的配置中,如果連接超過30分鐘未關閉,就會被強行回收,并且日志記錄連接申請時的調用堆棧。
內置監控頁面查看未關閉連接堆棧信息
當removeAbandoned=true之后,可以在內置監控界面datasource.html中的查看ActiveConnection?StackTrace屬性的,可以看到未關閉連接的具體堆棧信息,從而方便查出哪些連接泄漏了。
web應用
如果你的應用配置了WebStatFilter
在內置監控頁面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount屬性,如果不相等,就是泄漏了。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的$cfg_dbtype = mysql_Druid连接池二(学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java关闭inputstream_关闭
- 下一篇: 二维数组的查找 java_二维数组中的查