JDBC連接池
—— C3P0數據庫連接池
1. DBCP簡介
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。如果需要使用該連接池實現,應在系統中添加如下一個jar文件:
- c3p0.jar:連接池的實現(比如:c3p0-0.9.1.2.jar)
2. 使用C3P0的步驟
- 加入jar包:c3p0.jar
- 創建C3P0數據源:new ComboPooledDataSource();
- 設置數據源必須的屬性
- 從數據源獲取連接
3. 一個簡易的測試範例
pom.xml
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
測試類
package com.tqazy.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
import java.sql.Connection;
public class TestC3p0 {
@Test
public void testC3p0() throws Exception {
// 1. 創建C3P0數據源
ComboPooledDataSource cpds = new ComboPooledDataSource();
// 2. 設置數據源必須的屬性
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
cpds.setUser("root");
cpds.setPassword("admin123");
// 3. 從數據源獲取連接
Connection connection = cpds.getConnection();
// 打印連接
System.out.println(connection.getClass());
}
}
結果
4. 讀取配置文件創建數據源
我們是否可以像DBCP一樣從文件中讀取配置信息呢?
當然可以,C3P0是從xml中讀取的配置文件,我們可以在resources資源文件夾下創建文件[c3p0-config.xml]文件,文件名不可變。
步驟:
- 創建c3p0-config.xml文件
- 創建ComboPooledDataSource實例:
DataSource dataSource = new ComboPooledDataSource("helloc3p0");
- 從
DataSource
實例中獲取數據庫連接
下面是我的配置文件代碼:
最上面的name="helloc3p0"
是表示這個配置塊的名字爲helloc3p0
。我們可以配置不同的配置快,然後在引用時選擇。
上面的四個配置表示的是必須配置的屬性,其他的可選配置的全部配置在第5小節可查詢
<c3p0-config>
<named-config name="helloc3p0">
<!-- 指定連接數據源的基本屬性 -->
<property name="driverClassName">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">admin123</property>
<!-- 當C3P0數據源中的連接池耗盡時,一次同時獲取的連接數 -->
<property name="acquireIncrement">3</property>
<!-- 初始化數據庫連接池時連接的數量 -->
<property name="initialPoolSize">5</property>
<!-- 數據庫連接池中的最小的數據庫連接數 -->
<property name="minPoolSize">5</property>
<!-- 數據庫連接池中的最大的數據庫連接數 -->
<property name="maxPoolSize">13</property>
<!-- C3P0數據庫連接池可以維護的Statement的個數 -->
<property name="maxStatements">20</property>
<!-- 每一個連接同時可以使用的Statement對象個數 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
測試方法
其實很簡單,我們在正常創建C3P0實例時,選擇重載方法,傳入我們配置的配置塊的名字,即可自動讀取並使用
@Test
public void testC3p0WithConfigFile() throws SQLException {
// helloc3p0是配置文件裏named-config的name的值
DataSource dataSource = new ComboPooledDataSource("helloc3p0");
System.out.println(dataSource.getConnection().getClass());
ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource;
System.out.println(comboPooledDataSource.getAcquireIncrement());
System.out.println(comboPooledDataSource.getMaxPoolSize());
}
結果
5. C3P0屬性說明
這裏是圖片,下面有表格(一模一樣),可以複製Ctrl+F查詢意思
表格:
屬性名 | 註釋 |
---|---|
acquireIncrement | 默認值爲3,表示當C3P0數據源中的連接池耗盡時,一次同時獲取的連接數。 |
acquireRetryAttempts | 默認值爲30,表示從數據庫中獲取新連接失敗後,重複嘗試的次數。如果將其設置爲0或者小於0的數值,則C3P0將一直進行嘗試獲取連接。 |
acquireRetryDelay | 默認值爲1000,單位爲毫秒,表示C3P0相鄰兩次獲取連接的時間間隔。 |
autoCommitOnClose | 默認爲false,表示在連接關閉時,將所有未提交的操作回滾。設置爲true,則在連接關閉時,會將操作進行提交。 |
automaticTestTable | 默認爲null,設置該屬性後,C3P0會自動創建一張名爲該屬性值的空表,專門是C3P0用來測試使用者所獲取的數據庫連接,使用者是沒法對該表進行操作的。同時該屬性設置後,則忽略preferredTestQuery屬性。 |
preferredTestQuery | 默認爲null,表示所有連接測試都要執行的測試語句,這一屬性的設置能夠顯著地提高測試速度。注意:該測試語句裏的表必須在數據源初始化的時候就已經存在了。 |
breakAfterAcquireFailure | 默認爲false,表示在獲取數據庫連接失敗時,會引起所有等待連接池獲取連接的線程拋出異常,但是數據源仍然保持有效,並且在下次調用getConnection時繼續嘗試獲取連接。設置爲true,表示在獲取數據庫連接失敗時,重複嘗試acquireRetryAttempts指定的次數,此時再失敗,則聲明數據源已經斷開並且永久關閉。 |
driverClass | 默認爲null,值爲全類名,該類是提供數據庫連接的JDBC驅動類。默認C3P0會去檢測其是否爲JDBC驅動程序的實例,如果想跳過這步驗證,可設置forceUseNamedDriverClass屬性。 |
forceUseNamedDriverClass | 默認爲false,設置爲true,表示強制指定driverClass屬性指定的類爲JDBC驅動程序的實例,而讓C3P0不再做這一步檢測。 |
dataSourceName | 默認爲C3P0指定的標識符,表示數據源的名稱,便於我們追蹤和查找數據源。 |
jdbcUrl | 默認爲null,表示數據庫的JDBC URL,用來獲取數據庫連接。 |
user | 默認爲null,表示使用數據源時需要的用戶名。 |
password | 默認爲null,表示使用數據源時需要的密碼。 |
minPoolSize | 默認爲3,表示連接池中任何時候可以存放的連接最小數量。 |
maxPoolSize | 默認爲15,表示連接池中任何時候可以存放的連接最大數量。 |
initialPoolSize | 默認爲3,表示初始化連接池時獲取的連接個數。該數值在miniPoolSize和maxPoolSize之間。 |
testConnectionOnCheckin | 默認爲false,設置爲true,表示向連接池中放入連接時測試連接的有效性。 |
testConnectionOnCheckout | 默認爲false,設置爲true,表示從連接池中取出連接時測試連接的有效性,因爲此操作會降低性能,建議使用idleConnectionTestPeriod或者automaticTestTable來提升連接測試的性能。 |
checkoutTimeout | 默認爲0,單位爲毫秒,表示當連接池中連接用完時,客戶端調用getConnection獲取連接等待的時間,如果超時,則拋出SQLException異常。特殊值0表示無限期等待。 |
connectionCustomizerClassName | 默認爲null,值爲全類名,該類必須實現ConnectionCustomizer接口,用來管理Connection的生命週期,例如獲取連接時設置Connection的隔離級別,Connection丟棄的時候進行資源關閉等等。一般不配置該屬性。 |
connectionTesterClassName | 默認爲com.mchange.v2.c3p0.impl.DefaultConnectionTester,值爲全類名,該類必須實現ConnectionTester或者QueryConnectionTester,用來測試數據庫的連接。 |
debugUnreturnedConnectionStackTraces | 默認爲false,只可在debug下設置該屬性爲true,因爲該設置會降低從連接池中獲取連接的性能。設置爲true,並且UnreturnedConnectionTimeOut設置爲非0自然數,則C3P0會追蹤所有從連接池中取出的連接,對於超時未歸還的,會打印追蹤信息。該設置就是爲了測試應用對數據庫的連接是否忘記歸還,從而導致從C3P0連接池中取出的連接越來越多,最終池中連接被耗盡。 |
extensions | 默認爲空的Map,用來爲C3P0設置自己的配置信息,一般是用來管理Connection生命週期(ConnectionCustomizer)的時候使用。 |
factoryClassLocation | 默認爲null,指定C3P0.libraries的路徑,如果本地可以獲取,則該值設置爲null。 |
forceIgnoreUnresolvedTransactions | 默認爲false,強烈不推薦,設置爲true,將導致出現奇怪的bug出現。 |
idleConnectionTestPeriod | 默認爲0,單位爲秒,設置爲非0自然數,表示每隔指定秒去檢測一次連接池中的空閒連接。 |
maxConnectionAge | 默認爲0,單位爲秒,表示連接超過該屬性指定的時間,則被銷燬掉,並且從連接池中移除,0則表示沒有時間限制。 |
maxIdleTime | 默認爲0,單位爲秒,表示在連接池中未被使用的連接最長存活多久不被移除。 |
maxIdleTimeExcessConnections | 默認爲0,單位爲秒,表示在連接池中未被使用的、超出miniPoolSize的那些連接最長存活多久不被移除。 |
maxStatements | 默認爲0,表示JDBC的標準參數,控制數據源內緩存的PreparedStatements數量。和maxStatementsPerConnection配合使用,如果二者都爲0,則statement不進行緩存。如果該參數爲0,而maxStatementsPerConnection爲非零自然數,則表示每一個連接緩存的PreparedStatements數量。 |
maxStatementsPerConnection | 默認爲0,表示每一個連接緩存的PreparedStatements數量。 |
本章結束
如果本文有錯誤或對本文有不理解的地方歡迎評論 ^_^
如果本文有幫助到您,可以點一下右上角的贊哦,謝謝啦