$cfg_dbtype = mysql_Druid连接池二(学习笔记)
6.Druid關(guān)聯(lián)
6.1.Web關(guān)聯(lián)監(jiān)控配置
WebStatFilter用于采集web-jdbc關(guān)聯(lián)監(jiān)控的數(shù)據(jù)。
web.xml配置:
DruidWebStatFiltercom.alibaba.druid.support.http.WebStatFilterexclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*DruidWebStatFilter/*
exlusions配置
經(jīng)常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。比如:
exclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
sessionStatMaxCount配置
缺省sessionStatMaxCount是1000個(gè)。你可以按需要進(jìn)行配置,比如:
sessionStatMaxCount1000
sessionStatEnable配置
你可以關(guān)閉session統(tǒng)計(jì)功能,比如:
sessionStatEnablefalse
principalSessionName配置
你可以配置principalSessionName,使得druid能夠知道當(dāng)前的session的用戶是誰(shuí)。比如:
principalSessionNamexxx.user
根據(jù)需要,把其中的xxx.user修改為你user信息保存在session中的sessionName。
注意:如果你session中保存的是非string類型的對(duì)象,需要重載toString方法。
principalCookieName
如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當(dāng)前的user是誰(shuí)
principalCookieNamexxx.user
根據(jù)需要,把其中的xxx.user修改為你user信息保存在cookie中的cookieName
profileEnable
druid?0.2.7版本開始支持profile,配置profileEnable能夠監(jiān)控單個(gè)url調(diào)用的sql列表。
profileEnabletrue
結(jié)果展示
6.2.Spring關(guān)聯(lián)監(jiān)控配置
Druid提供了Spring和Jdbc的關(guān)聯(lián)監(jiān)控。
配置spring
com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一個(gè)標(biāo)準(zhǔn)的Spring?MethodInterceptor。可以靈活進(jìn)行AOP配置。
Spring?AOP的配置文檔:
按類型攔截配置
druid-stat-interceptor
方法名正則匹配攔截配置
com.mycompany.service.*com.mycompany.dao.*
有些情況下,可能你需要配置proxy-target-class,例如
按照BeanId來(lái)攔截配置
xxx-daoxxx-servicedruid-stat-interceptor
6.Druid防御
Druid提供了WallFilter,它是基于SQL語(yǔ)義分析來(lái)實(shí)現(xiàn)防御SQL注入攻擊的。
這個(gè)文檔提供基于Spring的各種配置方式。
使用缺省配置的WallFilter
...
結(jié)合其他Filter一起使用
WallFilter可以結(jié)合其他Filter一起使用,例如:
...
這樣,攔截檢測(cè)的時(shí)間不在StatFilter統(tǒng)計(jì)的SQL執(zhí)行時(shí)間內(nèi)。
如果希望StatFilter統(tǒng)計(jì)的SQL執(zhí)行時(shí)間內(nèi),則使用如下配置:
...
指定dbType
有時(shí)候,一些應(yīng)用框架做了自己的JDBC?Proxy?Driver,是的DruidDataSource無(wú)法正確識(shí)別數(shù)據(jù)庫(kù)的類型,則需要特別指定,如下:
...
指定配置裝載的目錄
缺省情況下,配置裝載的目錄如下:
數(shù)據(jù)庫(kù)類型
目錄
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詳細(xì)說(shuō)明
本身的配置
配置項(xiàng)
缺省值
dir
按照dbType分別配置:
mysql?:?META-INF/druid/wall/mysql
oracle?:?META-INF/druid/wall/oracle
sqlserver?:?META-INF/druid/wall/sqlserver
攔截配置-語(yǔ)句
配置項(xiàng)
缺省值
描述
selelctAllow
true
是否允許執(zhí)行SELECT語(yǔ)句
selectAllColumnAllow
true
是否允許執(zhí)行SELECT?*?FROM?T這樣的語(yǔ)句。如果設(shè)置為false,不允許執(zhí)行select?*?from?t,但select?*?from?(select?id,?name?from?t)?a。這個(gè)選項(xiàng)是防御程序通過(guò)調(diào)用select?*獲得數(shù)據(jù)表的結(jié)構(gòu)信息。
selectIntoAllow
true
SELECT查詢中是否允許INTO字句
deleteAllow
true
是否允許執(zhí)行DELETE語(yǔ)句
updateAllow
true
是否允許執(zhí)行UPDATE語(yǔ)句
insertAllow
true
是否允許執(zhí)行INSERT語(yǔ)句
replaceAllow
true
是否允許執(zhí)行REPLACE語(yǔ)句
mergeAllow
true
是否允許執(zhí)行MERGE語(yǔ)句,這個(gè)只在Oracle中有用
callAllow
true
是否允許通過(guò)jdbc的call語(yǔ)法調(diào)用存儲(chǔ)過(guò)程
setAllow
true
是否允許使用SET語(yǔ)法
truncateAllow
true
truncate語(yǔ)句是危險(xiǎn),缺省打開,若需要自行關(guān)閉
createTableAllow
true
是否允許創(chuàng)建表
alterTableAllow
true
是否允許執(zhí)行Alter?Table語(yǔ)句
dropTableAllow
true
是否允許修改表
commentAllow
false
是否允許語(yǔ)句中存在注釋,Oracle的用戶不用擔(dān)心,Wall能夠識(shí)別hints和注釋的區(qū)別
noneBaseStatementAllow
false
是否允許非以上基本語(yǔ)句的其他語(yǔ)句,缺省關(guān)閉,通過(guò)這個(gè)選項(xiàng)就能夠屏蔽DDL。
multiStatementAllow
false
是否允許一次執(zhí)行多條語(yǔ)句,缺省關(guān)閉
useAllow
true
是否允許執(zhí)行mysql的use語(yǔ)句,缺省打開
describeAllow
true
是否允許執(zhí)行mysql的describe語(yǔ)句,缺省打開
showAllow
true
是否允許執(zhí)行mysql的show語(yǔ)句,缺省打開
commitAllow
true
是否允許執(zhí)行commit操作
rollbackAllow
true
是否允許執(zhí)行roll?back操作
如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都設(shè)置為false,這就是一個(gè)只讀數(shù)據(jù)源了。
攔截配置-永真條件
配置項(xiàng)
缺省值
描述
selectWhereAlwayTrueCheck
true
檢查SELECT語(yǔ)句的WHERE子句是否是一個(gè)永真條件
selectHavingAlwayTrueCheck
true
檢查SELECT語(yǔ)句的HAVING子句是否是一個(gè)永真條件
deleteWhereAlwayTrueCheck
true
檢查DELETE語(yǔ)句的WHERE子句是否是一個(gè)永真條件
deleteWhereNoneCheck
false
檢查DELETE語(yǔ)句是否無(wú)where條件,這是有風(fēng)險(xiǎn)的,但不是SQL注入類型的風(fēng)險(xiǎn)
updateWhereAlayTrueCheck
true
檢查UPDATE語(yǔ)句的WHERE子句是否是一個(gè)永真條件
updateWhereNoneCheck
false
檢查UPDATE語(yǔ)句是否無(wú)where條件,這是有風(fēng)險(xiǎn)的,但不是SQL注入類型的風(fēng)險(xiǎn)
conditionAndAlwayTrueAllow
false
檢查查詢條件(WHERE/HAVING子句)中是否包含AND永真條件
conditionAndAlwayFalseAllow
false
檢查查詢條件(WHERE/HAVING子句)中是否包含AND永假條件
conditionLikeTrueAllow
true
檢查查詢條件(WHERE/HAVING子句)中是否包含LIKE永真條件
其他攔截配置
配置項(xiàng)
缺省值
描述
selectIntoOutfileAllow
false
SELECT?...?INTO?OUTFILE?是否允許,這個(gè)是mysql注入攻擊的常見手段,缺省是禁止的
selectUnionCheck
true
檢測(cè)SELECT?UNION
selectMinusCheck
true
檢測(cè)SELECT?MINUS
selectExceptCheck
true
檢測(cè)SELECT?EXCEPT
selectIntersectCheck
true
檢測(cè)SELECT?INTERSECT
mustParameterized
false
是否必須參數(shù)化,如果為True,則不允許類似WHERE?ID?=?1這種不參數(shù)化的SQL
strictSyntaxCheck
true
是否進(jìn)行嚴(yán)格的語(yǔ)法檢測(cè),Druid?SQL?Parser在某些場(chǎng)景不能覆蓋所有的SQL語(yǔ)法,出現(xiàn)解析SQL出錯(cuò),可以臨時(shí)把這個(gè)選項(xiàng)設(shè)置為false,同時(shí)把SQL反饋給Druid的開發(fā)者。
conditionOpXorAllow
false
查詢條件中是否允許有XOR條件。XOR不常用,很難判斷永真或者永假,缺省不允許。
conditionOpBitwseAllow
true
查詢條件中是否允許有"&"、"~"、"|"、"^"運(yùn)算符。
conditionDoubleConstAllow
false
查詢條件中是否允許連續(xù)兩個(gè)常量運(yùn)算表達(dá)式
minusAllow
true
是否允許SELECT?*?FROM?A?MINUS?SELECT?*?FROM?B這樣的語(yǔ)句
intersectAllow
true
是否允許SELECT?*?FROM?A?INTERSECT?SELECT?*?FROM?B這樣的語(yǔ)句
constArithmeticAllow
true
攔截常量運(yùn)算的條件,比如說(shuō)WHERE?FID?=?3?-?1,其中"3?-?1"是常量運(yùn)算表達(dá)式。
limitZeroAllow
false
是否允許limit?0這樣的語(yǔ)句
禁用對(duì)象檢測(cè)配置
配置項(xiàng)
缺省值
描述
tableCheck
true
檢測(cè)是否使用了禁用的表
schemaCheck
true
檢測(cè)是否使用了禁用的Schema
functionCheck
true
檢測(cè)是否使用了禁用的函數(shù)
objectCheck
true
檢測(cè)是否使用了“禁用對(duì)對(duì)象”
variantCheck
true
檢測(cè)是否使用了“禁用的變量”
readOnlyTables
空
指定的表只讀,不能夠在SELECT?INTO、DELETE、UPDATE、INSERT、MERGE中作為"被修改表"出現(xiàn)
Jdbc相關(guān)配置
配置項(xiàng)
缺省值
描述
metadataAllow
true
是否允許調(diào)用Connection.getMetadata方法,這個(gè)方法調(diào)用會(huì)暴露數(shù)據(jù)庫(kù)的表信息
wrapAllow
true
是否允許調(diào)用Connection/Statement/ResultSet的isWrapFor和unwrap方法,這兩個(gè)方法調(diào)用,使得有辦法拿到原生驅(qū)動(dòng)的對(duì)象,繞過(guò)WallFilter的檢測(cè)直接執(zhí)行SQL。
WallFiler配置說(shuō)明
配置項(xiàng)
缺省值
描述
logViolation
false
對(duì)被認(rèn)為是攻擊的SQL進(jìn)行LOG.error輸出
throwException
true
對(duì)被認(rèn)為是攻擊的SQL拋出SQLExcepton
config
provider
剛開始引入WallFilter的時(shí)候,把logViolation設(shè)置為true,而throwException設(shè)置為false。就可以觀察是否存在違規(guī)的情況,同時(shí)不影響業(yè)務(wù)運(yùn)行。
7.Druid參考
不同的業(yè)務(wù)場(chǎng)景需求不同,你可以使用我們的參考配置,但建議你仔細(xì)閱讀相關(guān)文檔,了解清楚之后做定制配置。
以下是一個(gè)參考的連接池配置:
通常來(lái)說(shuō),只需要修改initialSize、minIdle、maxActive。
如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫(kù)分表較多的數(shù)據(jù)庫(kù),建議配置為false。
9.?Druid日志
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里:
Druid內(nèi)置提供了三種LogFilter(Log4jFilter、CommonsLogFilter、Slf4jLogFilter),用于輸出JDBC執(zhí)行的日志。這些Filter都是Filter-Chain擴(kuò)展機(jī)制中的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執(zhí)行輸出,看實(shí)現(xiàn)代碼:
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";}
你可以根據(jù)你的需要修改,在log4j.properties文件上做配置時(shí),注意配置使用相關(guān)的logger。
3.?配置輸出日志
缺省輸入的日志信息全面,但是內(nèi)容比較多,有時(shí)候我們需要定制化配置日志輸出。
...
參數(shù)
說(shuō)明
dataSourceLogEnabled
所有DataSource相關(guān)的日志
connectionLogEnabled
所有連接相關(guān)的日志
connectionLogErrorEnabled
所有連接上發(fā)生異常的日志
statementLogEnabled
所有Statement相關(guān)的日志
statementLogErrorEnabled
所有Statement發(fā)生異常的日志
resultSetLogEnabled
resultSetLogErrorEnabled
connectionConnectBeforeLogEnabled
connectionConnectAfterLogEnabled
connectionCommitAfterLogEnabled
connectionRollbackAfterLogEnabled
connectionCloseAfterLogEnabled
statementCreateAfterLogEnabled
statementPrepareAfterLogEnabled
statementPrepareCallAfterLogEnabled
statementExecuteAfterLogEnabled
statementExecuteQueryAfterLogEnabled
statementExecuteUpdateAfterLogEnabled
statementExecuteBatchAfterLogEnabled
statementCloseAfterLogEnabled
statementParameterSetLogEnabled
resultSetNextAfterLogEnabled
resultSetOpenAfterLogEnabled
resultSetCloseAfterLogEnabled
4.?log4j.properties配置
如果你使用log4j,可以通過(guò)log4j.properties文件配置日志輸出選項(xiàng),例如:
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.?輸出可執(zhí)行的SQL
Java啟動(dòng)參數(shù)配置方式
-Ddruid.log.stmt.executableSql=true
logFilter參數(shù)直接配置
10.Druid泄露
Druid提供了多種監(jiān)測(cè)連接泄漏的手段
連接泄漏監(jiān)測(cè)
當(dāng)程序存在缺陷時(shí),申請(qǐng)的連接忘記關(guān)閉,這時(shí)候,就存在連接泄漏了。Druid提供了RemoveAbandanded相關(guān)配置,用來(lái)關(guān)閉長(zhǎng)時(shí)間不使用的連接。例如:
配置
...?...???...?...
配置removeAbandoned對(duì)性能會(huì)有一些影響,建議懷疑存在泄漏之后再打開。在上面的配置中,如果連接超過(guò)30分鐘未關(guān)閉,就會(huì)被強(qiáng)行回收,并且日志記錄連接申請(qǐng)時(shí)的調(diào)用堆棧。
內(nèi)置監(jiān)控頁(yè)面查看未關(guān)閉連接堆棧信息
當(dāng)removeAbandoned=true之后,可以在內(nèi)置監(jiān)控界面datasource.html中的查看ActiveConnection?StackTrace屬性的,可以看到未關(guān)閉連接的具體堆棧信息,從而方便查出哪些連接泄漏了。
web應(yīng)用
如果你的應(yīng)用配置了WebStatFilter
在內(nèi)置監(jiān)控頁(yè)面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount屬性,如果不相等,就是泄漏了。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的$cfg_dbtype = mysql_Druid连接池二(学习笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java关闭inputstream_关闭
- 下一篇: mysql按照datetime精确查询_