Druid連接池默認配置和坑


一、公司默認配置

  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的解析

DBCP連接池TestOnBorrow的坑

數據連接池默認配置帶來的坑testOnBorrow=false,cloes_wait 終於解決了

 


免責聲明!

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



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