數據源配置:
#datasource #Introductions: https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8 #https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE #初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時 default:0 spring.datasource.druid.initial-size=2 #最大連接池數量。default=8+ spring.datasource.druid.max-active=20 #最小連接池數量。maxIdle已經廢棄 spring.datasource.druid.min-idle=10 #獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,並發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖 spring.datasource.druid.max-wait=60000 #是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。default=false spring.datasource.druid.pool-prepared-statements=false #要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,會存在Oracle下PSCache占用內存過多的問題,可以把這個數據配置大一些,比如100.default=-1 spring.datasource.druid.max-pool-prepared-statement-per-connection-size=-1 #用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow,testOnBorrow,testOnReturn,testWhileIdle都不會起作用。這個可以不配置 #spring.datasource.druid.validation-query=select 'x' #單位:秒,檢測連接是否有效的超時時間。底層調用jdbc Statement對象的void. setQueryTImeout(int seconds)方法,mysql實現的不是很合理,不建議在mysql下配置此參數 #spring.datasource.druid.validation-query-timeout=60 #申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。default=true spring.datasource.druid.test-on-borrow=false #歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。default=false spring.datasource.druid.test-on-return=false #建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。default=false spring.datasource.druid.test-while-idle=true #連接池中的minIdle數據以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。default=false spring.datasource.druid.keep-alive=true #配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 default=1分鍾 #有兩個含義: # (1)Destroy線程會檢測連接的間隔時間,如果連接空閑時間大於等於minEvictableIdleTimeMillis則關閉物理連接 # (2)testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 spring.datasource.druid.time-between-eviction-runs-millis=60000 #池中的連接保持空閑而不被驅逐的最小時間,單位是毫秒 spring.datasource.druid.min-evictable-idle-time-millis=300000 #合並多個DruidDataSource的監控數據 spring.datasource.druid.use-global-data-source-stat=true #spring.datasource.druid.filters=#配置多個英文逗號分隔 # 配置StatFilter 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 # 配置WallFilter 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 spring.datasource.druid.filter.wall.config.create-table-allow=false spring.datasource.druid.filter.wall.config.alter-table-allow=false spring.datasource.druid.filter.wall.config.truncate-allow=false
4. SQL合並配置
當你程序中存在沒有參數化的sql執行時,sql統計的效果會不好。比如:
select * from t where id = 1 select * from t where id = 2 select * from t where id = 3
在統計中,顯示為3條sql,這不是我們希望要的效果。StatFilter提供合並的功能,能夠將這3個SQL合並為如下的SQL
select * from t where id = ?
配置StatFilter的mergeSql屬性
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="mergeSql" value="true" />
</bean>
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
spring.datasource.druid.filters=config,stat,wall,log4j 配置監控統計攔截的filters,去掉后監控界面SQL無法進行統計,’wall’用於防火牆
WebStatFilter用於采集web-jdbc關聯監控的數據。【只是提供一個展示界面,及展示界面本身按一定維度統計的數據】
用來展示已經統計到的監控數據
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
監控配置【展示一些Filter已經存放的數據】,主要決定怎么展示
# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter spring.datasource.druid.web-stat-filter.enabled= #是否啟用StatFilter默認值false spring.datasource.druid.web-stat-filter.url-pattern= spring.datasource.druid.web-stat-filter.exclusions= spring.datasource.druid.web-stat-filter.session-stat-enable= spring.datasource.druid.web-stat-filter.session-stat-max-count= spring.datasource.druid.web-stat-filter.principal-session-name= spring.datasource.druid.web-stat-filter.principal-cookie-name= spring.datasource.druid.web-stat-filter.profile-enable= # StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置 spring.datasource.druid.stat-view-servlet.enabled= #是否啟用StatViewServlet(監控頁面)默認值為false(考慮到安全問題默認並未啟動,如需啟用建議設置密碼或白名單以保障安全) spring.datasource.druid.stat-view-servlet.url-pattern= spring.datasource.druid.stat-view-servlet.reset-enable= spring.datasource.druid.stat-view-servlet.login-username= spring.datasource.druid.stat-view-servlet.login-password= spring.datasource.druid.stat-view-servlet.allow= spring.datasource.druid.stat-view-servlet.deny= # Spring監控配置,說明請參考Druid Github Wiki,配置_Druid和Spring關聯監控配置 spring.datasource.druid.aop-patterns= # Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
如何配置 Filter
你可以通過 spring.datasource.druid.filters=stat,wall,log4j ...
的方式來啟用相應的內置Filter,不過這些Filter都是默認配置。如果默認配置不能滿足你的需求,你可以放棄這種方式,通過配置文件來配置Filter,下面是例子。
# 配置StatFilter
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
# 配置WallFilter
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# 其他 Filter 配置不再演示
目前為以下 Filter 提供了配置支持,請參考文檔或者根據IDE提示(spring.datasource.druid.filter.*
)進行配置。
- StatFilter
- WallFilter
- ConfigFilter
- EncodingConvertFilter
- Slf4jLogFilter
- Log4jFilter
- Log4j2Filter
- CommonsLogFilter
要想使自定義 Filter 配置生效需要將對應 Filter 的 enabled
設置為 true
,Druid Spring Boot Starter 默認禁用 StatFilter,你也可以將其 enabled
設置為 true
來啟用它。
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
http://120.26.192.168/druid/datasource.html
如果你用druid,看監控數據庫,NotEmptyWaitCount數量多,或者可以考慮加大連接池的MaxActive數量。
數據庫處理不過來導致execute queryTimeout了
有一個Druid連接池的錯誤,錯誤信息是這樣的“The last packet successfully received from the server was 3,984,663 milliseconds ago. The last packet sent successfully to the server was 37 milliseconds ago.”,連接池缺省配置的testWhileIdle,按理來說不應該發生這樣的錯誤。阿里應用一直沒問題,但是外部的用戶偶爾零星反饋過來,多年來都是如此,我一直很擔心。
最近幾天有一個阿里雲的用戶遇到這樣的問題,直接通過阿里雲客服找過來支持,經過多次在對方生產環境測試驗證,終於找到原因,是用法的問題,不是Druid的問題,確認了這個之后,多年的擔心可放下了。
問題是這樣的,申請連接后間隔長時間再createStatememt執行Sql,而testWhileIdle只在getConnectin()時發揮作用。代碼示例如下:
Connection conn = druidDataSource.getConnection();
// 這里做耗時很長的事情,比如一個Hive大任務,跑數個小時
Statement stmt = conn.createStatement();
stmt.execute(); // 這里拋錯
Druid內置提供了四種LogFilter(Log4jFilter、Log4j2Filter、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.Log4jFilter druid.filters.log4j2=com.alibaba.druid.filter.logging.Log4j2Filter druid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilter druid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilter druid.filters.commonLogging=com.alibaba.druid.filter.logging.CommonsLogFilter
他們的別名分別是log4j、log4j2、slf4j、commonlogging和commonLogging。其中commonlogging和commonLogging只是大小寫不同。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ... ... <property name="filters" value="stat,log4j" /> </bean>
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。
2. 配置輸出日志
缺省輸入的日志信息全面,但是內容比較多,有時候我們需要定制化配置日志輸出。
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <property name="resultSetLogEnabled" value="false" /> </bean> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ... <property name="proxyFilters"> <list> <ref bean="log-filter"/> </list> </property> </bean>
參數 | 說明 |
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,stdout log4j.logger.druid.sql.DataSource=warn,stdout log4j.logger.druid.sql.Connection=warn,stdout log4j.logger.druid.sql.Statement=warn,stdout log4j.logger.druid.sql.ResultSet=warn,stdout
5. 輸出可執行的SQL
Java啟動參數配置方式
-Ddruid.log.stmt.executableSql=true
logFilter參數直接配置
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <property name="statementExecutableSqlLogEnable" value="true" /> </bean>
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter
MySql+Mybatis+Druid:sql injection violation, multi-statement not allow
做一個批量update的操作 ,sqlmap如下:
<update id="updateBatch" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> update device_bd_token <set> access_token=#{item.accessToken} </set> where device_id = #{item.deviceId} </foreach> </update>
剛開始以為是連接數據庫的url上沒有加上支持批量的參數,然后就改了下:
jdbc.url=jdbc:mysql://192.168.11.107:3306/alarm_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
結果還是同樣的錯誤!但是在命令行直接執行又是沒問題的,這就很奇怪了!
仔細看日志,好像是Druid的WallFilter.check()拋出來的,那就是說是Druid在做預編譯的時候,給拋出的異常,還沒有到mysql的服務器。
最終的解決辦法是這樣的:
<bean id="dataSourceOne" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="wall-filter"/> </list> </property> </bean>
<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter"> <property name="config" ref="wall-config" /> </bean> <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig"> <property name="multiStatementAllow" value="true" /> </bean>
配置一個multiStatementAllow參數就可以了。
看下源碼的處理:
也就是說,只要把config的multiStatementAllow設置為true就可以避免出現這樣的錯誤了!
Druid配置的時候還有一個大坑就是,不要同時配置filters和proxyFilters,filter都是內置的,想通過proxyFilters來定制的話,就不要配置filters。
DruidDataSource繼承了DruidAbstractDataSource,
可以看出來,既可以配置filters,也可以配置proxyFilters,不同的是,filters是字符串別名,proxyFilters是類。
我們繼續看一下這些字符串的值應該是啥樣的:
原來在這里:
這就是druid內置的所有的filter了,去掉前綴druid.filters就是別名了。
[ERROR] session ip change too many (WebSessionStat.java:266)的原因及不完整解決辦法
最近將項目放到公網,結果反復刷新頁面后,出現了大量的[ERROR] session ip change too many (WebSessionStat.java:266)錯誤,如下圖
仔細查找,原來是alibaba druid提示的,具體來說,是druid監控session時,記錄訪問IP提示的。
如果只想看解決方法,對原因無興趣,請直接跳到本文末尾,下面是產生的原因。
首先打開druid的源代碼,找到com.alibaba.druid.support.http.stat.WebSessionStat類,可以看到輸出錯誤的源代碼
public void addRemoteAddress(String ip) { if (remoteAddresses == null) { this.remoteAddresses = ip; return; } if (remoteAddresses.contains(ip)) { return; } if (remoteAddresses.length() > 256) { LOG.error("session ip change too many"); return; } remoteAddresses += ';' + ip; }
很明顯,是由於每次訪問的ip不一樣,然后remoteAddresses += ';' + ip;多次累加,導致remoteAddresses超過了256位長度。可是為什么同一個session每次ip會不一樣,ip又是怎么獲取的,這需要繼續跟蹤源代碼。
跟蹤源代碼可以看到com.alibaba.druid.util.DruidWebUtils的public static String getRemoteAddr(HttpServletRequest request)方法中,是這么獲取IP的:
package com.alibaba.druid.util; import javax.servlet.GenericServlet; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; public class DruidWebUtils { public static String getRemoteAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
可以看到,druid獲得ip的方法是request.getHeader("x-forwarded-for");,這個方法會獲取到ip:port,而國內由於公網IP極其匱乏,導致絕大部分人上網都是通過地址映射以后來上網,這就導致了每次請求的ip、端口都可能不一樣,那么自然會被WebSessionStat.addRemoteAddress()方法累加到remoteAddresses,導致remoteAddresses越來越長,最終超過256位長度,觸發LOG.error("session ip change too many");語句。
知道原因,下面就是修改方法:
方法一:關閉druid的session監控。
在web.xml配置druid的地方,將sessionStatEnable設為false即可,如下:
方法二:修改druid的源碼。
下載或反編譯druid的源碼,將LOG.error("session ip change too many");注釋掉,或者將if條件長度改大即可。
方法三:等。等阿里巴巴官方修改相關代碼。
參考文獻:http://www.oschina.net/question/579092_243246
---------------------
作者:zhu19774279
來源:CSDN
原文:https://blog.csdn.net/zhu19774279/article/details/50392813
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
配置WebStatFilter
WebStatFilter用於采集web-jdbc關聯監控的數據。
web.xml配置
<filter> <filter-name>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
exclusions配置
經常需要排除一些不必要的url,比如*.js,/jslib/*等等。配置在init-param中。比如:
<init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param>
sessionStatMaxCount配置
缺省sessionStatMaxCount是1000個。你可以按需要進行配置,比如:
<init-param> <param-name>sessionStatMaxCount</param-name> <param-value>1000</param-value> </init-param>
sessionStatEnable配置
你可以關閉session統計功能,比如:
<init-param> <param-name>sessionStatEnable</param-name> <param-value>false</param-value> </init-param>
principalSessionName配置
你可以配置principalSessionName,使得druid能夠知道當前的session的用戶是誰。比如:
<init-param> <param-name>principalSessionName</param-name> <param-value>xxx.user</param-value> </init-param>
根據需要,把其中的xxx.user修改為你user信息保存在session中的sessionName。
注意:如果你session中保存的是非string類型的對象,需要重載toString方法。
principalCookieName
如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當前的user是誰
<init-param> <param-name>principalCookieName</param-name> <param-value>xxx.user</param-value> </init-param>
根據需要,把其中的xxx.user修改為你user信息保存在cookie中的cookieName
profileEnable
druid 0.2.7版本開始支持profile,配置profileEnable能夠監控單個url調用的sql列表。
<init-param> <param-name>profileEnable</param-name> <param-value>true</param-value> </init-param>
結果展示
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
DruidDataSource配置兼容DBCP,但個別配置的語意有所區別。
配置 | 缺省值 | 說明 |
---|---|---|
name | 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強行設置name會出錯。詳情-點此處。 | |
url | 連接數據庫的url,不同數據庫不一樣。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
|
username | 連接數據庫的用戶名 | |
password | 連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細看這里 | |
driverClassName | 根據url自動識別 | 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName |
initialSize | 0 | 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時 |
maxActive | 8 | 最大連接池數量 |
maxIdle | 8 | 已經不再使用,配置了也沒效果 |
minIdle | 最小連接池數量 | |
maxWait | 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,並發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。 | |
poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100 |
validationQuery | 用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。 | |
validationQueryTimeout | 單位:秒,檢測連接是否有效的超時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法 | |
testOnBorrow | true | 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
testOnReturn | false | 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
testWhileIdle | false | 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。 |
keepAlive | false (1.0.28) |
連接池中的minIdle數量以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。 |
timeBetweenEvictionRunsMillis | 1分鍾(1.0.14) | 有兩個含義: 1) Destroy線程會檢測連接的間隔時間,如果連接空閑時間大於等於minEvictableIdleTimeMillis則關閉物理連接。 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 |
numTestsPerEvictionRun | 30分鍾(1.0.14) | 不再使用,一個DruidDataSource只支持一個EvictionRun |
minEvictableIdleTimeMillis | 連接保持空閑而不被驅逐的最小時間 | |
connectionInitSqls | 物理連接初始化的時候執行的sql | |
exceptionSorter | 根據dbType自動識別 | 當數據庫拋出一些不可恢復的異常時,拋棄連接 |
filters | 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall |
|
proxyFilters | 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關系,並非替換關系 |
如果表格無法完全展示,請查看圖片:
https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8