1. 程式人生 > >spring學習筆記(17)資料庫配置[1]spring資料連線池詳解

spring學習筆記(17)資料庫配置[1]spring資料連線池詳解

資料連線池

在spring中,常使用資料庫連線池來完成對資料庫的連線配置,類似於執行緒池的定義,資料庫連線池就是維護有一定數量資料庫連線的一個緩衝池,一方面,能夠即取即用,免去初始化的時間,另一方面,用完的資料連線會歸還到連線池中,這樣就免去了不必要的連線建立、銷燬工作,提升了效能。當然,使用連線池,有一下幾點是連線池配置所考慮到的,也屬於配置連線池的優點,而這些也會我們後面的例項配置中體現:
1、 如果沒有任何一個使用者使用連線,那麼那麼應該維持一定數量的連線,等待使用者使用。
2、 如果連線已經滿了,則必須開啟新的連線,供更多使用者使用。
3、 如果一個伺服器就只能有100個連線,那麼如果有第101個人過來呢?應該等待其他使用者釋放連線
4、 如果一個使用者等待時間太長了,則應該告訴使用者,操作是失敗的。

在spring中,常用的連線池有:jdbc,dbcp,c3p0,JNDI4種,他們有不同的優缺點和適用場景。其中,spring框架推薦使用dbcp,hibernate框架推薦使用c3p0。經測試發現,c3p0與dbcp相比較,c3p0能夠更好的支援高併發,但是在穩定性方面略遜於dpcp。
下面對幾個連線池進行示例配置:

  1. jdbc連線池配置示例
<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property> <property name="url" value="jdbc:mysql://localhost:3306/yc" /> <property name="username" value="yc"></property> <property name="password" value="yc"></property> </bean>

DriverManagerDataSource沒有實現連線池化連線的機制,每次呼叫getConnection()獲取新連線時,只是簡單地建立一個新的連線。所以,一般這種方式常用於開發時測試,不用於生產。

  1. dbcp連線池配置示例
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"><!--設定為close使Spring容器關閉同時資料來源能夠正常關閉,以免造成連線洩露  -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/yc" />
    <property name="username" value="yc" />
    <property name="password" value="yc" />
    <property name="defaultReadOnly" value="false" /><!-- 設定為只讀狀態,配置讀寫分離時,讀庫可以設定為true -->
    <!-- 在連線池建立後,會初始化並維護一定數量的資料庫安連線,當請求過多時,資料庫會動態增加連線數,
    當請求過少時,連線池會減少連線數至一個最小空閒值 -->
    <property name="initialSize" value="5" /><!-- 在啟動連線池初始建立的資料庫連線,預設為0 -->
    <property name="maxActive" value="15" /><!-- 設定資料庫同一時間的最大活躍連線預設為8,負數表示不閒置 -->
    <property name="maxIdle" value="10"/><!-- 在連線池空閒時的最大連線數,超過的會被釋放,預設為8,負數表示不閒置 -->
    <property name="minIdle" value="2" /><!-- 空閒時的最小連線數,低於這個數量會建立新連線,預設為0 -->
    <property name="maxWait" value="10000" /><!-- 連線被用完時等待歸還的最大等待時間,單位毫秒,超出時間拋異常,預設為無限等待 -->
</bean>

以上引數是我們在實際開發中常用到的。關於分析都在註釋裡。

  1. c3p0連線池配置示例
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/yc" />
        <property name="user" value="yc" />
        <property name="password" value="yc" />
</bean>

它的常用配置屬性見下表:

屬性 說明 預設值
acquireIncrement 當連線池中的連線用完時,C3P0一次性建立新連線的數目 5
acquireRetryAttempts 定義在從資料庫獲取新連線失敗後重復嘗試獲取的次數 30
checkoutTimeout 當連線池用完時客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒 0
initialPoolSize 初始化時建立的連線數,應在minPoolSize與maxPoolSize之間取值 3
maxIdleTime 最大空閒時間,超過空閒時間的連線將被丟棄。為0或負數則永不丟棄 0
maxPoolSize 連線池中保留的最大連線數 15
numHelperThreads C3P0是非同步操作的,緩慢的JDBC操作通過幫助程序完成。擴充套件這些操作可以有效的提升效能,通過多執行緒實現多個操作同時被執行 3

4. JNDI連線池配置示例
如果我們需要使用遠端伺服器(如WebLogic等)自帶的資料來源時,常使用這種配置。JNDI在spring中有兩種配置方式,一種是利用spring內建的JndiObjectFactoryBean。

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">        
        <property name="jndiName" value="java:comp/env/jdbc/yc/>        
</bean>

另一種則是利用Spring為獲取j2ee資源提供的一個jee名稱空間:

    <!--1.現在xmlns下新增:
    jee=http://www.springframework.org/schema/jee     
    2. 然後在xsi:schemaLocation下新增:    
    http://www.springframework.org/schema/jee      
    http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">     
    3. 然後我們可以直接使用<jee:jndi-lookup>標籤完成配置    -->
    <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/yc"/>        

在下一篇文章,我會示例如何通過JNDI在我們的應用伺服器上配置多資料來源,然後在我們的web專案中進行訪問。同時,我們會結合AOP簡單模擬主從分庫的讀寫分離例項。通過針對我們的DAO層的不同訪問資料庫方法來完成我們的讀寫分離。