Druid內置提供一個StatFilter,用於統計監控信息。
1. 別名配置
StatFilter的別名是stat,這個別名映射配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties。
在spring中使用別名配置方式如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat" />
</bean>
2. 組合配置
StatFilter可以和其他的Filter配置使用,比如:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat,log4j" />
</bean>
在上面的配置中,StatFilter和Log4jFilter組合使用。
3. 通過proxyFilters屬性配置
別名配置是通過filters屬性配置的,filters屬性的類型是String。如果需要通過bean的方式配置,使用proxyFilters屬性。
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="slowSqlMillis" value="10000" />
<property name="logSlowSql" value="true" />
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
... ...
<property name="filters" value="log4j" />
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
</list>
</property>
</bean>
其中filters和proxyFilters屬性是組合關系的,不是替換的,在上面的配置中,dataSource有了兩個Filter,StatFilter和Log4jFilter。
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>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
... ...
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
</list>
</property>
</bean>
StatFilter支持一種簡化配置方式,和上面的配置等同的。如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="mergeStat" />
</bean>
mergeStat是的MergeStatFilter縮寫,我們看MergeStatFilter的實現:
public class MergeStatFilter extends StatFilter {
public MergeStatFilter() {
super.setMergeSql(true);
}
}
從實現代碼來看,僅僅是一個mergeSql的缺省值。
也可以通過connectProperties屬性來打開mergeSql功能,例如:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat" />
<property name="connectionProperties" value="druid.stat.mergeSql=true" />
</bean>
或者通過增加JVM的參數配置:
-Ddruid.stat.mergeSql=true
4.1 合並SQL對tddl的支持
在druid-0.2.17版本之后,sql合並支持tddl,能夠對分表進行合並。
5. 慢SQL記錄
StatFilter屬性slowSqlMillis用來配置SQL慢的標准,執行時間超過slowSqlMillis的就是慢。slowSqlMillis的缺省值為3000,也就是3秒。
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="slowSqlMillis" value="10000" />
<property name="logSlowSql" value="true" />
</bean>
在上面的配置中,slowSqlMillis被修改為10秒,並且通過日志輸出執行慢的SQL。
slowSqlMillis屬性也可以通過connectProperties來配置,例如:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="filters" value="stat" />
<property name="connectionProperties" value="druid.stat.slowSqlMillis=5000" />
</bean>
6. 合並多個DruidDataSource的監控數據
缺省多個DruidDataSource的監控數據是各自獨立的,在Druid-0.2.17版本之后,支持配置公用監控數據,配置參數為useGloalDataSourceStat。例如:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
... ...
<property name="useGlobalDataSourceStat" value="true" />
</bean>
或者通過jvm啟動參數來指定,例如:
-Ddruid.useGlobalDataSourceStat=true
全部使用jvm啟動參數來配置,可以這樣:
-Ddruid.filters=mergeStat -Ddruid.useGlobalDataSourceStat=true
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter