Druid 專題


數據源配置:

#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>  

 

結果報錯:
Caused by: java.sql.SQLException: sql injection violation, multi-statement not allow : update device_bd_token   
                 SET access_token=?   
                where device_id = ?  
          ;   
                update device_bd_token   
                 SET access_token=?   
                where device_id = ?  
    at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:714)  
    at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:240)  
    at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448)  
    at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:928)  
    at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122)  
    at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448)  
    at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342)  
    at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:318)  

 

剛開始以為是連接數據庫的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







 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM