一、公司默認配置
ds_0: !!com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://{host}:{port}/{schema}
username: username
password: password
connectionProperties: config.decrypt=true
filters: mergeStat,config,slf4j
initialSize: 1
maxActive: 20
minIdle: 1
maxWait: 6000
validationQuery: SELECT 1 FROM DUAL
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 25200000
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
logAbandoned: true
removeAbandoned: true
removeAbandonedTimeout: 1800
removeAbandonedTimeoutMillis: 1800000
二、網上推薦配置
參考:https://www.jianshu.com/p/e75d73129f51
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="url" value="${jdbc_url}" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="5" /> <property name="minIdle" value="5" /> <property name="maxActive" value="10" /> <!-- 配置從連接池獲取連接等待超時的時間 --> <property name="maxWait" value="10000" /> <!-- 配置間隔多久啟動一次DestroyThread,對連接池內的連接才進行一次檢測,單位是毫秒。 檢測時:1.如果連接空閑並且超過minIdle以外的連接,如果空閑時間超過minEvictableIdleTimeMillis設置的值則直接物理關閉。2.在minIdle以內的不處理。 --> <property name="timeBetweenEvictionRunsMillis" value="600000" /> <!-- 配置一個連接在池中最大空閑時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 設置從連接池獲取連接時是否檢查連接有效性,true時,每次都檢查;false時,不檢查 --> <property name="testOnBorrow" value="false" /> <!-- 設置往連接池歸還連接時是否檢查連接有效性,true時,每次都檢查;false時,不檢查 --> <property name="testOnReturn" value="false" /> <!-- 設置從連接池獲取連接時是否檢查連接有效性,true時,如果連接空閑時間超過minEvictableIdleTimeMillis進行檢查,否則不檢查;false時,不檢查 --> <property name="testWhileIdle" value="true" /> <!-- 檢驗連接是否有效的查詢語句。如果數據庫Driver支持ping()方法,則優先使用ping()方法進行檢查,否則使用validationQuery查詢進行檢查。(Oracle jdbc Driver目前不支持ping方法) --> <property name="validationQuery" value="select 1 from dual" /> <!-- 單位:秒,檢測連接是否有效的超時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法 --> <!-- <property name="validationQueryTimeout" value="1" /> --> <!-- 打開后,增強timeBetweenEvictionRunsMillis的周期性連接檢查,minIdle內的空閑連接,每次檢查強制驗證連接有效性. 參考:https://github.com/alibaba/druid/wiki/KeepAlive_cn --> <property name="keepAlive" value="true" /> <!-- 連接泄露檢查,打開removeAbandoned功能 , 連接從連接池借出后,長時間不歸還,將觸發強制回連接。回收周期隨timeBetweenEvictionRunsMillis進行,如果連接為從連接池借出狀態,並且未執行任何sql,並且從借出時間起已超過removeAbandonedTimeout時間,則強制歸還連接到連接池中。 --> <property name="removeAbandoned" value="true" /> <!-- 超時時間,秒 --> <property name="removeAbandonedTimeout" value="80"/> <!-- 關閉abanded連接時輸出錯誤日志,這樣出現連接泄露時可以通過錯誤日志定位忘記關閉連接的位置 --> <property name="logAbandoned" value="true" /> <!-- 根據自身業務及事務大小來設置 --> <property name="connectionProperties" value="oracle.net.CONNECT_TIMEOUT=2000;oracle.jdbc.ReadTimeout=10000"></property> <!-- 打開PSCache,並且指定每個連接上PSCache的大小,Oracle等支持游標的數據庫,打開此開關,會以數量級提升性能,具體查閱PSCache相關資料 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <!-- <property name="filters" value="stat,slf4j" /> --> <property name="proxyFilters"> <list> <ref bean="log-filter" /> <ref bean="stat-filter" /> </list> </property> <!-- 配置監控統計日志的輸出間隔,單位毫秒,每次輸出所有統計數據會重置,酌情開啟 --> <property name="timeBetweenLogStatsMillis" value="120000" /> </bean>
三、關於testOnBorrow=false的解析
數據連接池默認配置帶來的坑testOnBorrow=false,cloes_wait 終於解決了
