druid 參數配置詳解
Table of Contents
1 初始化鏈接
在druid鏈接數據庫的配置文件中,讀寫datasource的bean中 要有 init-method="init". 配置,不然在啓動鏈接池時不會執行初始化操做。 示例: css
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ....... </bean>
2 參數配置及說明
經過 spring 配置文件application-context.xml中的dataSource配置說明各個參數的配置。 html
屬性 | 說明 | 建議值 |
---|---|---|
url | 數據庫的jdbc鏈接地址。通常爲鏈接oracle/mysql。示例以下: | |
mysql : jdbc:mysql://ip:port/dbname?option1&option2&… | ||
oracle : jdbc:oracle:thin:@ip:port:oracle_sid | ||
username | 登陸數據庫的用戶名 | |
password | 登陸數據庫的用戶密碼 | |
initialSize | 啓動程序時,在鏈接池中初始化多少個鏈接 | 10-50已足夠 |
maxActive | 鏈接池中最多支持多少個活動會話 | |
maxWait | 程序向鏈接池中請求鏈接時,超過maxWait的值後,認爲本次請求失敗,即鏈接池 | 100 |
沒有可用鏈接,單位毫秒,設置-1時表示無限等待 | ||
minEvictableIdleTimeMillis | 池中某個鏈接的空閒時長達到 N 毫秒後, 鏈接池在下次檢查空閒鏈接時,將 | 見說明部分 |
回收該鏈接,要小於防火牆超時設置 | ||
net.netfilter.nf_conntrack_tcp_timeout_established的設置 | ||
timeBetweenEvictionRunsMillis | 檢查空閒鏈接的頻率,單位毫秒, 非正整數時表示不進行檢查 | |
keepAlive | 程序沒有close鏈接且空閒時長超過 minEvictableIdleTimeMillis,則會執 | true |
行validationQuery指定的SQL,以保證該程序鏈接不會池kill掉,其範圍不超 | ||
過minIdle指定的鏈接個數。 | ||
minIdle | 回收空閒鏈接時,將保證至少有minIdle個鏈接. | 與initialSize相同 |
removeAbandoned | 要求程序從池中get到鏈接後, N 秒後必須close,不然druid 會強制回收該 | false,當發現程序有未 |
鏈接,無論該鏈接中是活動仍是空閒, 以防止進程不會進行close而霸佔鏈接。 | 正常close鏈接時設置爲true | |
removeAbandonedTimeout | 設置druid 強制回收鏈接的時限,當程序從池中get到鏈接開始算起,超過此 | 應大於業務運行最長時間 |
值後,druid將強制回收該鏈接,單位秒。 | ||
logAbandoned | 當druid強制回收鏈接後,是否將stack trace 記錄到日誌中 | true |
testWhileIdle | 當程序請求鏈接,池在分配鏈接時,是否先檢查該鏈接是否有效。(高效) | true |
validationQuery | 檢查池中的鏈接是否仍可用的 SQL 語句,drui會鏈接到數據庫執行該SQL, 若是 | |
正常返回,則表示鏈接可用,不然表示鏈接不可用 | ||
testOnBorrow | 程序 申請 鏈接時,進行鏈接有效性檢查(低效,影響性能) | false |
testOnReturn | 程序 返還 鏈接時,進行鏈接有效性檢查(低效,影響性能) | false |
poolPreparedStatements | 緩存經過如下兩個方法發起的SQL: | true |
public PreparedStatement prepareStatement(String sql) | ||
public PreparedStatement prepareStatement(String sql, | ||
int resultSetType, int resultSetConcurrency) | ||
maxPoolPrepareStatementPerConnectionSize | 每一個鏈接最多緩存多少個SQL | 20 |
filters | 這裏配置的是插件,經常使用的插件有: | stat,wall,slf4j |
監控統計: filter:stat | ||
日誌監控: filter:log4j 或者 slf4j | ||
防護SQL注入: filter:wall | ||
connectProperties | 鏈接屬性。好比設置一些鏈接池統計方面的配置。 | |
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 | ||
好比設置一些數據庫鏈接屬性: | ||
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> .... </bean>
3 注意事項
3.1 底層鏈接
另外還有一個參數 accessToUnderlyingConnectionAllowed. 該參數設置是否容許使用底層鏈接。 若是設置爲true,可使用下面的方式來獲取底層鏈接: java
Connection conn = ds.getConnection(); Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); ... conn.close();
默認false不開啓, 由於代碼邏輯不正確,可能會帶來風險。建議須要直接訪問驅動的特定功能時再使用,而且通過屢次測試, 明確代碼每一步可能帶來的風險。 python
3.2 空閒檢查問題
在使用阿里的SLB時,建議將timeBetweenEvictionRunsMillis設置爲2秒或者負值(關閉檢查機制)。不然,鏈接進程會報: mysql
Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicaiotnsException: Communications link failure
4 不一樣配置文件
本部分只經過示例的方式展現在不一樣的環境中進行配置的語法格式,具體要配置哪些參數,請參照 參數配置及說明. spring
其中 spring boot application.properties 中的配置最爲完整,建議參考。 sql
4.1 jdbc中配置鏈接池
jdbc.properties: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://172.49.15.55:3306/testdb?useUnicode=true&characterEncoding=utf-8 jdbc.username=test jdbc.password=test jdbc.filters=stat jdbc.maxActive=300 jdbc.initialSize=2 jdbc.maxWait=60000 jdbc.minIdle=1 jdbc.timeBetweenEvictionRunsMillis=60000 jdbc.minEvictableIdleTimeMillis=300000 jdbc.validationQuery=SELECT 'x' jdbc.testWhileIdle=true jdbc.testOnBorrow=false jdbc.testOnReturn=false jdbc.poolPreparedStatements=false jdbc.maxPoolPreparedStatementPerConnectionSize=50
4.2 springs中配置druid
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 」鏈接「的基本屬性 --> <property name="url" value="jdbc_url" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 鏈接池屬性 --> <property name="initialSize" value="100" /> <property name="maxActive" value="1000" /> <property name="maxWait" value="60000" /> <property name="minEvictableIdleTimeMillis" value=300000 /> <property name="keepAlive" value=true /> <property name="timeBetweenEvictionRunsMillis" value=-1 /> <property name="minIdle" value="20" /> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="180"/> <property name="logAbandoned" value="true" /> <property name="testWhileIdle" value="true" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <property name="filters" value="stat,wall,slf4j"/> <property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000" /> </bean>
4.3 spring boot application.properties配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #驅動配置信息 spring.datasource.driver-class-name=com.mysql.jdbc.Driver #基本鏈接信息 spring.datasource.username = root spring.datasource.password = root spring.datasource.url=jdbc:mysql://192.168.153.23:3306/mytest?useUnicode=true&characterEncoding=utf-8 #鏈接池屬性 spring.datasource.druid.initial-size=15 spring.datasource.druid.max-active=100 spring.datasource.druid.min-idle=15 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false spring.datasource.druid.test-while-idle=true spring.datasource.druid.validation-query=SELECT 1 spring.datasource.druid.validation-query-timeout=1000 spring.datasource.druid.keep-alive=true spring.datasource.druid.remove-abandoned=true spring.datasource.druid.remove-abandoned-timeout=180 spring.datasource.druid.log-abandoned=true spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,slf4j spring.datasource.druid.use-global-data-source-stat=true spring.datasource.druid.preparedStatement=true spring.datasource.druid.maxOpenPreparedStatements=100 spring.datasource.druid.connect-properties.mergeSql=true spring.datasource.druid.connect-properties.slowSqlMillis=5000