Druid使用以及配置


1 初始化連接

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

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

2 參數配置及說明

通過 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 注意事項

 

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

4 不同配置文件

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

其中 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


免責聲明!

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



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