1. 程式人生 > >Java資料庫連線池細節探討

Java資料庫連線池細節探討

我們知道,資料庫連線池可以把資料庫的連線快取起來,下次使用的話可以直接取到快取起來的資料庫連線。那麼,在這個過程中有幾個細節需要注意:
1、資料庫的連線數有沒有限制?
2、資料庫會不會自動斷開已經建立的連線?
3、如果資料庫重啟了,但應用沒有重啟,那麼資料庫連線池中的所有連線都不可用了,怎麼解決?
假如資料庫連線池需要建立的連線數比資料庫能夠支援的最大連線數要大,那麼肯定會導致連線建立不了,如果資料庫連線池中的連線長時間得不到使用,那麼資料庫會不會自動斷開這個連線以節省資源?這是在處理資料庫連線池和資料庫配置時必須要考慮的問題。
對於第一個問題,請參見部落格:怎麼實時檢視mysql當前連線數


對於第二個問題,請參見部落格:MySQL中interactive_timeout和wait_timeout的區別
參考以下資料庫連線池的配置,其中有對連線的有效性進行驗證的配置屬性:

<beans:bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">         
	<!-- <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  --> 
		<beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		
		<beans:property name="url" value="${mysql.url}" />
		<beans:property name="username" value="${mysql.username}" />
		<beans:property name="password" value="${mysql.password}" />
		
         <!--maxActive: 最大連線數量-->  
        <beans:property name="maxActive" value="150"/>
        <!--minIdle: 最小空閒連線-->  
        <beans:property name="minIdle" value="4"/>
        <!--maxIdle: 最大空閒連線-->  
        <beans:property name="maxIdle" value="20"/>
        <!--initialSize: 初始化連線-->  
        <beans:property name="initialSize" value="2"/>
        
        <beans:property name="validationQuery" value="SELECT 1"/>
        <beans:property name="testWhileIdle" value="true"/>       
        <!-- 切記配為false,配為true對效能有嚴重影響 -->
		<beans:property name="testOnBorrow" value="false"/>
        <!-- 連線被洩露時是否列印 -->
        <beans:property name="logAbandoned" value="true"/>
        <!--removeAbandoned: 是否自動回收超時連線-->  
        <beans:property name="removeAbandoned"  value="true"/>
        <!--removeAbandonedTimeout: 超時時間(以秒數為單位)-->  
        <beans:property name="removeAbandonedTimeout" value="1200"/>
        <!--maxWait: 超時等待時間以毫秒為單位 1000*10-->
        <beans:property name="maxWait" value="10000"/>
        <!-- 在空閒連接回收器執行緒執行期間休眠的時間值,以毫秒為單位,60秒 1000*60 -->
        <beans:property name="timeBetweenEvictionRunsMillis" value="600000"/>
        <!--  在每次空閒連接回收器執行緒(如果有)執行時檢查的連線數量,最好跟maxActive一致 -->
        <beans:property name="numTestsPerEvictionRun" value="40"/>
        <!-- 1000 * 60 * 30  連線在池中保持空閒而不被空閒連接回收器執行緒-->
        <beans:property name="minEvictableIdleTimeMillis" value="1800000"/>
        <!--add by  20180818 bgein   -->
        <!-- 配置監控統計攔截的filters -->
        <beans:property name="filters" value="wall,stat"/>
        <beans:property name="proxyFilters">
            <beans:list>
                <beans:ref bean="stat-filter"></beans:ref>
                <beans:ref bean="log-filter"></beans:ref>
            </beans:list>
        </beans:property>
		<!--add by  20180818 end   -->
    </beans:bean>

具體的druid資料來源配置詳解參見部落格:阿里巴巴資料庫連線池 druid配置詳解
關於資源池的介紹詳見部落格:資源池(從記憶體池到連線池)