18. JDBC連接池 — C3P0數據庫連接池

JDBC連接池

  —— C3P0數據庫連接池

1. DBCP簡介

C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。如果需要使用該連接池實現,應在系統中添加如下一個jar文件:

  • c3p0.jar:連接池的實現(比如:c3p0-0.9.1.2.jar)

2. 使用C3P0的步驟

  1. 加入jar包:c3p0.jar
  2. 創建C3P0數據源:new ComboPooledDataSource();
  3. 設置數據源必須的屬性
  4. 從數據源獲取連接

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]文件,文件名不可變。

步驟:

  1. 創建c3p0-config.xml文件
  2. 創建ComboPooledDataSource實例:DataSource dataSource = new ComboPooledDataSource("helloc3p0");
  3. 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查詢意思

聲明:點擊此處查詢本數據截圖來源

C3P0


表格

屬性名 註釋
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數量。

本章結束

回到目錄


如果本文有錯誤或對本文有不理解的地方歡迎評論 ^_^

如果本文有幫助到您,可以點一下右上角的贊哦,謝謝啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章