druid 參數配置詳解

初始化連接

在druid連接數據庫的配置文件中,讀寫datasource的bean中 要有 init-method="init". 配置,否則在啓動連接池時不會執行初始化操作。 示例:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
.......
  </bean>

參數配置及說明

通過 spring 配置文件application-context.xml中的dataSource配置說明各個參數的配置。

屬性 說明 建議值
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.1 底層連接

另外還有一個參數 accessToUnderlyingConnectionAllowed. 該參數設置是否允許使用底層連接。 如果設置爲true,可以使用下面的方式來獲取底層連接:

Connection conn = ds.getConnection();

Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();

...

conn.close();

默認false不開啓, 因爲代碼邏輯不正確,可能會帶來風險。建議需要直接訪問驅動的特定功能時再使用,並且經過多次測試, 明確代碼每一步可能帶來的風險。

3.2 空閒檢查問題

在使用阿里的SLB時,建議將timeBetweenEvictionRunsMillis設置爲2秒或者負值(關閉檢查機制)。否則,連接進程會報:

Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicaiotnsException: Communications link failure

不同配置文件

本部分只通過示例的方式展示在不同的環境中進行配置的語法格式,具體要配置哪些參數,請參照 參數配置及說明.

其中 spring boot application.properties 中的配置最爲完整,建議參考。

4.1 jdbc中配置連接池

jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.49.15.55:3306/testdb?useUnicode=true&amp;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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章