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層的不同訪問數據庫方法來完成我們的讀寫分離。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com