Mysql Druid連線池配置

2021-10-25 00:16:33 字數 3988 閱讀 5649

druid是阿里巴巴開源平台上乙個資料庫連線池實現,它結合了c3p0、dbcp、proxool等db池的優點,同時加入了日誌監控,可以很好的監控db池連線和sql的執**況,可以說是針對監控而生的db連線池。

(1)datasource中url重要配置引數(spring配置字首:spring.datasource.url)

配置預設值

說明推薦說明

servertimezone

時區asia/shanghai

useunicode

true

characterencoding

1、存資料

資料庫在存放專案資料的時候會先用utf-8格式將資料解碼成位元組碼,然後再將解碼後的位元組碼重新使用gbk編碼,並存放到資料庫中。

2、取資料

在資料庫中取資料的時候,資料庫會先將資料庫中的資料按gbk格式解碼成位元組碼,然後再將解碼後的位元組碼重新按utf-8格式編碼資料,最後再將資料返回給客戶端

utf8

usessl

true

mysql在高版本需要指明是否進行ssl連線

false

(2)druid重要配置引數(spring配置字首:spring.datasource.druid)

配置預設值

描述推薦說明

initial-size

0初始化時建立物理連線的個數。初始化發生在顯示呼叫init方法,或者第一次getconnection時

連線數=(核心數 * 2) + 有效磁碟數)

min-idle

最小連線池數量

與initialsize一致

max-idle

8最大連線池數量

max-wait

獲取連線時最大等待時間,單位毫秒。配置了maxwait之後,預設啟用公平鎖,併發效率會有所下降,如果需要可以通過配置useunfairlock屬性為true使用非公平鎖

use-unfair-lock

false

如果設定了maxwait,則啟用公平鎖

time-between-eviction-runs-millis

60000

在空閒連線**器執行緒執行期間休眠時間,它決定執行緒多久驗證空閒連線或丟棄連線的頻率

原始碼上看,是通過validation-query配置的語句語句檢測連線的有效性,如果連線失敗了則丟棄

min-evictableidle-time-millis

1800000

連線在池中保持空閒而不被**的最小時間

validation-query

用來檢測連線是否有效的sql,要求是乙個查詢語句。如果validationquery為null,testonborrow、testonreturn、testwhileidle都不會其作用false

如果檢測到已知驅動後,會使用mysqlvalidconnectionchecker類進行有效檢測,走的是ping策略,而不是該配置,哪怕沒有配置也會走預設的 「select 1」,前提是使用mysqlvalidconnectionchecker,不然是直接返回true的

validation-query-timeout

-1檢測連線超時時間

雖然這裡預設是-1,但是實際**會設定成1s的時間

test-on-borrow

false

申請連線時執行validationquery檢測連線是否有效,做了這個配置會降低效能

test-while-idle

true

建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於timebetweenevictionrunsmillis,執行validationquery檢測連線是否有效

test-on-return

false

歸還連線時執行validationquery檢測連線是否有效,做了這個配置會降低效能

pool-prepared-statements

false

是否快取preparedstatement,也就是pscache。pscache對支援游標的資料庫效能提公升巨大,比如說oracle。在mysql下建議關閉

max-open-prepared-statements

-1要啟用pscache,必須配置大於0,當大於0時,poolpreparedstatements自動觸發修改為true。在druid中,不會存在oracle下pscache占用記憶體過多的問題,可以把這個數值配置大一些,比如說100

filter-class-names

flter.stat.slow-sql-millis

spring:

datasource:

url: jdbc:mysql:

username: root

password: root

driver-class-name: com.mysql.cj.jdbc.driver

以資料庫例項是4核8g為例(待考量):

spring:

datasource:

druid:

initial-size: 10

min-idle: 10

max-active: 25

max-wait: 60000

use-unfair-lock: true

time-between-eviction-runs-millis: 60000

min-evictable-idle-time-millis: 300000

設定後,效能會翻倍(見參考資料有讚優化),但是這樣做有沒有其他問題?

(1) com.alibaba.druid.pool.druiddatasource#getconnectiondirect

public druidpooledconnection getconnectiondirect(long maxwaitmillis) throws sqlexception  else 

if (testwhileidle)

if (lastkeeptimemillis > lastactivetimemillis)

long idlemillis = currenttimemillis - lastactivetimemillis;

long timebetweenevictionrunsmillis = this.timebetweenevictionrunsmillis;

if (timebetweenevictionrunsmillis <= 0)

// 如果空閒時間達到闕值

if (idlemillis >= timebetweenevictionrunsmillis

|| idlemillis < 0 // unexcepted branch

) // 無效則關閉連線

discardconnection(poolableconnection.holder);

continue;}}

}}

// ...

}

(2) 關閉連線後,如果當前存活數小於最小連線數

空訊號的處理利用的是aqs的condition.sign(),這裡還不確定會不會開啟。condition忘記了~

public void discardconnection(druidconnectionholder holder) 

connection conn = holder.getconnection();

if (conn != null)

lock.lock();

try

if (holder.active)

discardcount++;

holder.discard = true;

if (activecount <= minidle)

} finally

}

【有讚db連線池效能優化】

【資料庫連線池的大小配置】

nhibernate連線池配置

nhibernate連線池配置 nhibernate.driver.sqlclientdriver server 127.0.0.1 initial catalog sun user id sun password 123456 min pool size 10 max pool size 50 c...

tomcat 連線池配置

maxidle,最大空閒數,資料庫連線的最大空閒時間。超過空閒時間,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制。maxactive,連線池的最大資料庫連線數。設為0表示無限制。maxwait 最大建立連線等待時間。如果超過此時間將接到異常。設為 1表示無限制。maxactive 最大連...

Druid連線池配置

druid連線池,在阿里 使用過很好用的。druid集連線池,監控於一體整好復合當前專案的需要,專案是ssm結構,首先spring配置datasource,配置如下 id datasource class com.alibaba.druid.pool.druiddatasource init met...