spring學習筆記(17)資料庫配置[1]spring資料連線池詳解
資料連線池
在spring中,常使用資料庫連線池來完成對資料庫的連線配置,類似於執行緒池的定義,資料庫連線池就是維護有一定數量資料庫連線的一個緩衝池,一方面,能夠即取即用,免去初始化的時間,另一方面,用完的資料連線會歸還到連線池中,這樣就免去了不必要的連線建立、銷燬工作,提升了效能。當然,使用連線池,有一下幾點是連線池配置所考慮到的,也屬於配置連線池的優點,而這些也會我們後面的例項配置中體現:
1、 如果沒有任何一個使用者使用連線,那麼那麼應該維持一定數量的連線,等待使用者使用。
2、 如果連線已經滿了,則必須開啟新的連線,供更多使用者使用。
3、 如果一個伺服器就只能有100個連線,那麼如果有第101個人過來呢?應該等待其他使用者釋放連線
4、 如果一個使用者等待時間太長了,則應該告訴使用者,操作是失敗的。
在spring中,常用的連線池有:jdbc,dbcp,c3p0,JNDI4種,他們有不同的優缺點和適用場景。其中,spring框架推薦使用dbcp,hibernate框架推薦使用c3p0。經測試發現,c3p0與dbcp相比較,c3p0能夠更好的支援高併發,但是在穩定性方面略遜於dpcp。
下面對幾個連線池進行示例配置:
- 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()獲取新連線時,只是簡單地建立一個新的連線。所以,一般這種方式常用於開發時測試,不用於生產。
- 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>
以上引數是我們在實際開發中常用到的。關於分析都在註釋裡。
- 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層的不同訪問資料庫方法來完成我們的讀寫分離。