$cfg_dbtype = mysql_Druid连接池二(学习笔记)
6.Druid關聯(lián)
6.1.Web關聯(lián)監(jiān)控配置
WebStatFilter用于采集web-jdbc關聯(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個。你可以按需要進行配置,比如:
sessionStatMaxCount1000
sessionStatEnable配置
你可以關閉session統(tǒng)計功能,比如:
sessionStatEnablefalse
principalSessionName配置
你可以配置principalSessionName,使得druid能夠知道當前的session的用戶是誰。比如:
principalSessionNamexxx.user
根據(jù)需要,把其中的xxx.user修改為你user信息保存在session中的sessionName。
注意:如果你session中保存的是非string類型的對象,需要重載toString方法。
principalCookieName
如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當前的user是誰
principalCookieNamexxx.user
根據(jù)需要,把其中的xxx.user修改為你user信息保存在cookie中的cookieName
profileEnable
druid?0.2.7版本開始支持profile,配置profileEnable能夠監(jiān)控單個url調(diào)用的sql列表。
profileEnabletrue
結果展示
6.2.Spring關聯(lián)監(jiān)控配置
Druid提供了Spring和Jdbc的關聯(lián)監(jiān)控。
配置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語義分析來實現(xiàn)防御SQL注入攻擊的。
這個文檔提供基于Spring的各種配置方式。
使用缺省配置的WallFilter
...
結合其他Filter一起使用
WallFilter可以結合其他Filter一起使用,例如:
...
這樣,攔截檢測的時間不在StatFilter統(tǒng)計的SQL執(zhí)行時間內(nèi)。
如果希望StatFilter統(tǒng)計的SQL執(zhí)行時間內(nèi),則使用如下配置:
...
指定dbType
有時候,一些應用框架做了自己的JDBC?Proxy?Driver,是的DruidDataSource無法正確識別數(shù)據(jù)庫的類型,則需要特別指定,如下:
...
指定配置裝載的目錄
缺省情況下,配置裝載的目錄如下:
數(shù)據(jù)庫類型
目錄
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
是否允許執(zhí)行SELECT語句
selectAllColumnAllow
true
是否允許執(zhí)行SELECT?*?FROM?T這樣的語句。如果設置為false,不允許執(zhí)行select?*?from?t,但select?*?from?(select?id,?name?from?t)?a。這個選項是防御程序通過調(diào)用select?*獲得數(shù)據(jù)表的結構信息。
selectIntoAllow
true
SELECT查詢中是否允許INTO字句
deleteAllow
true
是否允許執(zhí)行DELETE語句
updateAllow
true
是否允許執(zhí)行UPDATE語句
insertAllow
true
是否允許執(zhí)行INSERT語句
replaceAllow
true
是否允許執(zhí)行REPLACE語句
mergeAllow
true
是否允許執(zhí)行MERGE語句,這個只在Oracle中有用
callAllow
true
是否允許通過jdbc的call語法調(diào)用存儲過程
setAllow
true
是否允許使用SET語法
truncateAllow
true
truncate語句是危險,缺省打開,若需要自行關閉
createTableAllow
true
是否允許創(chuàng)建表
alterTableAllow
true
是否允許執(zhí)行Alter?Table語句
dropTableAllow
true
是否允許修改表
commentAllow
false
是否允許語句中存在注釋,Oracle的用戶不用擔心,Wall能夠識別hints和注釋的區(qū)別
noneBaseStatementAllow
false
是否允許非以上基本語句的其他語句,缺省關閉,通過這個選項就能夠屏蔽DDL。
multiStatementAllow
false
是否允許一次執(zhí)行多條語句,缺省關閉
useAllow
true
是否允許執(zhí)行mysql的use語句,缺省打開
describeAllow
true
是否允許執(zhí)行mysql的describe語句,缺省打開
showAllow
true
是否允許執(zhí)行mysql的show語句,缺省打開
commitAllow
true
是否允許執(zhí)行commit操作
rollbackAllow
true
是否允許執(zhí)行roll?back操作
如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都設置為false,這就是一個只讀數(shù)據(jù)源了。
攔截配置-永真條件
配置項
缺省值
描述
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
是否必須參數(shù)化,如果為True,則不允許類似WHERE?ID?=?1這種不參數(shù)化的SQL
strictSyntaxCheck
true
是否進行嚴格的語法檢測,Druid?SQL?Parser在某些場景不能覆蓋所有的SQL語法,出現(xiàn)解析SQL出錯,可以臨時把這個選項設置為false,同時把SQL反饋給Druid的開發(fā)者。
conditionOpXorAllow
false
查詢條件中是否允許有XOR條件。XOR不常用,很難判斷永真或者永假,缺省不允許。
conditionOpBitwseAllow
true
查詢條件中是否允許有"&"、"~"、"|"、"^"運算符。
conditionDoubleConstAllow
false
查詢條件中是否允許連續(xù)兩個常量運算表達式
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
檢測是否使用了禁用的函數(shù)
objectCheck
true
檢測是否使用了“禁用對對象”
variantCheck
true
檢測是否使用了“禁用的變量”
readOnlyTables
空
指定的表只讀,不能夠在SELECT?INTO、DELETE、UPDATE、INSERT、MERGE中作為"被修改表"出現(xiàn)
Jdbc相關配置
配置項
缺省值
描述
metadataAllow
true
是否允許調(diào)用Connection.getMetadata方法,這個方法調(diào)用會暴露數(shù)據(jù)庫的表信息
wrapAllow
true
是否允許調(diào)用Connection/Statement/ResultSet的isWrapFor和unwrap方法,這兩個方法調(diào)用,使得有辦法拿到原生驅動的對象,繞過WallFilter的檢測直接執(zhí)行SQL。
WallFiler配置說明
配置項
缺省值
描述
logViolation
false
對被認為是攻擊的SQL進行LOG.error輸出
throwException
true
對被認為是攻擊的SQL拋出SQLExcepton
config
provider
剛開始引入WallFilter的時候,把logViolation設置為true,而throwException設置為false。就可以觀察是否存在違規(guī)的情況,同時不影響業(yè)務運行。
7.Druid參考
不同的業(yè)務場景需求不同,你可以使用我們的參考配置,但建議你仔細閱讀相關文檔,了解清楚之后做定制配置。
以下是一個參考的連接池配置:
通常來說,只需要修改initialSize、minIdle、maxActive。
如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫分表較多的數(shù)據(jù)庫,建議配置為false。
9.?Druid日志
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里:
Druid內(nèi)置提供了三種LogFilter(Log4jFilter、CommonsLogFilter、Slf4jLogFilter),用于輸出JDBC執(zhí)行的日志。這些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執(zhí)行輸出,看實現(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文件上做配置時,注意配置使用相關的logger。
3.?配置輸出日志
缺省輸入的日志信息全面,但是內(nèi)容比較多,有時候我們需要定制化配置日志輸出。
...
參數(shù)
說明
dataSourceLogEnabled
所有DataSource相關的日志
connectionLogEnabled
所有連接相關的日志
connectionLogErrorEnabled
所有連接上發(fā)生異常的日志
statementLogEnabled
所有Statement相關的日志
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,可以通過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.?輸出可執(zhí)行的SQL
Java啟動參數(shù)配置方式
-Ddruid.log.stmt.executableSql=true
logFilter參數(shù)直接配置
10.Druid泄露
Druid提供了多種監(jiān)測連接泄漏的手段
連接泄漏監(jiān)測
當程序存在缺陷時,申請的連接忘記關閉,這時候,就存在連接泄漏了。Druid提供了RemoveAbandanded相關配置,用來關閉長時間不使用的連接。例如:
配置
...?...???...?...
配置removeAbandoned對性能會有一些影響,建議懷疑存在泄漏之后再打開。在上面的配置中,如果連接超過30分鐘未關閉,就會被強行回收,并且日志記錄連接申請時的調(diào)用堆棧。
內(nèi)置監(jiān)控頁面查看未關閉連接堆棧信息
當removeAbandoned=true之后,可以在內(nèi)置監(jiān)控界面datasource.html中的查看ActiveConnection?StackTrace屬性的,可以看到未關閉連接的具體堆棧信息,從而方便查出哪些連接泄漏了。
web應用
如果你的應用配置了WebStatFilter
在內(nèi)置監(jiān)控頁面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount屬性,如果不相等,就是泄漏了。
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的$cfg_dbtype = mysql_Druid连接池二(学习笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java关闭inputstream_关闭
- 下一篇: 二维数组的查找 java_二维数组中的查