1. 程式人生 > >c3p0 資料庫連線池配置 詳細總結

c3p0 資料庫連線池配置 詳細總結

前言

關於 c3p0 一般有這麼兩種配置,一種是通過 set 方法進行配置,另一種是通過在同 src 目錄下的 c3p0-conflg.xml 檔案或者 c3p0.properties 檔案進行相關的配置。

一、c3p0 通過 set 方法進行配置

原始碼:

 private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    /**
     * 配置 DataSource
     */
    public static void configDataSource(){
        try {
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/XiaoPengwei");
            dataSource.setUser("XiaoPengwei");
            dataSource.setPassword("123456");
            dataSource.setInitialPoolSize(3);
            dataSource.setMaxPoolSize(10);
            dataSource.setMinPoolSize(3);
            dataSource.setAcquireIncrement(3);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
    }
    /**
     * 獲取 Connection 連線
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {

            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

二、c3p0 通過 c3p0-config.xml 檔案進行配置

關於通過配置檔案進行配置

  • 需要把 xml 檔案方法同 src 資料夾下,c3p0 會掃描檔案進行相關的配置
  • 在Maven依賴中要加入 c3p0 和 mysql-connector-java 依賴,版本號一定要寫。

c3p0-config.xml 檔案的程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 預設配置先不用管,如果沒有指定則使用這個配置 -->
    <default-config>
        <property name="user">zhanghanlun</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">3</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">2</property>
        <property name="maxStatements">200</property>
    </default-config>
    
    <!-- 自定義命名的配置,可以通過方法呼叫實現 -->
    <named-config name="test">
        <property name="user">Xiaopengwei</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/Xiaopengwei</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <!-- 如果池中資料連線不夠時一次增長多少個 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化資料庫連線池時連線的數量 -->
        <property name="initialPoolSize">20</property>
        <!-- 資料庫連線池中的最大的資料庫連線數 -->
        <property name="maxPoolSize">25</property>
        <!-- 資料庫連線池中的最小的資料庫連線數 -->
        <property name="minPoolSize">5</property>
    </named-config>
</c3p0-config>

java 類中程式碼對應如下:

 //載入名字為“test”的配置檔案
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("test");
    /**
     * 獲取Connection連線
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

這種方式會使 java 程式碼簡潔很多,通常使用配置檔案來建立資料庫的連線池

c3p0 常用配置引數介紹

在前面的 c3p0 的相關配置中,我們看到了 c3p0 的配置引數,這裡我們介紹幾個常用的 c3p0 的配置引數
最基礎的引數配置:

  1. driverClass : 資料庫驅動(例如 mysql,或者 oracle 資料庫的驅動)
  2. jdbcUrl: jdbc資料庫連線地址
    (例如jdbc:mysql://localhost:3306/Xiaopengwei)
  3. user:資料庫使用者名稱
  4. password:和資料庫使用者名稱對應的資料庫密碼

基礎的引數配置

引數 預設值 解釋
initialPoolSize 3 連線池初始化時建立的連線數(介於maxPoolSize和minPoolSize之間)
maxPoolSize 15 連線池中擁有的最大連線數,如果獲得新連線時會使連線總數超過這個值則不會再獲取新連線,而是等待其他連線釋放,所以這個值有可能會設計地很大
minPoolSize 3 連線池保持的最小連線數,後面的maxIdleTimeExcessConnections跟這個配合使用來減輕連線池的負載
acquireIncrement 3 連線池在無空閒連線可用時一次性建立的新資料庫連線數

管理池大小和連線時間的配置

引數 預設值 解釋
maxIdleTime 0 連線的最大空閒時間,如果超過這個時間,某個資料庫連線還沒有被使用,則會斷開掉這個連線如果為0,則永遠不會斷開連線
maxConnectorAge 0 連線的最大絕對年齡,單位是秒,0表示絕對年齡無限大
maxIdleTimeExcessConnection 0 單位秒,為了減輕連線池的負載,當連線池經過資料訪問高峰建立了很多連線,但是後面連線池不需要維護這麼多連線,必須小於maxIdleTime.配置不為0,則將連線池的數量保持到minPoolSize

配置連線測試

引數 預設值 解釋
automaticTestTable null 如果不為null,c3p0將生成指定名稱的空表,使用該表來測試連線
connectionTesterClassName com.mchange.v2.c3p0.impl.DefaultConnectionTester -通過實現ConnectionTester或QueryConnectionTester的類來測試連線。類名需制定全路徑。
idleConnectionTestPeriod 0 每個幾秒檢查所有連線池中的空閒連線
preferredTestQuery null 定義所有連線測試都執行的測試語句。在使用連線測試的情況下這個一顯著提高測試速度。注意: 測試的表必須在初始資料來源的時候就存在
testConnectionOnCheckin false 如果設為true那麼在取得連線的同時將校驗連線的有效性
testConnectionOnCheckout false 如果為true,在連線釋放的同事將校驗連線的有效性。

在這幾個引數中,idleConnectionTestPeriod、testConnectionOnCheckout 和testConnectuonOnCheckin 控制什麼時候連線將被校驗檢測

automaticTestTable、connectionTesterClassName 和 perferedTestQuery 控制連線將怎麼樣被檢測

配置語句池

引數 預設值 解釋
maxStatements 0 JDBC的標準引數,用以控制資料來源內載入d的PreparedStatements數量
maxStatementsPerConnection 0 maxStatementsPerConnection定義了連線池內單個連線所擁有的最大快取statements數
statementCacheNumDeferredCloseThreads 0 如果大於零,則語句池將延遲物理close()快取語句直到其父連線未被任何客戶端使用,或者在其內部(例如在測試中)由池本身使用。

配置資料庫的中斷恢復

引數 預設值 解釋
acquireRetryAttempts 30 定義在從資料庫獲取新連線失敗後重復嘗試的次數
acquireRetryDelay 1000 兩次連線間隔時間,單位毫秒
breakAfterAcquireFailure false 獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常。但是資料來源仍有效 保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試 獲取連線失敗後該資料來源將申明已斷開並永久關閉

配置未解決的事務處理

引數 預設值 解釋
autoCommitOnClose false 連線關閉時預設將所有未提交的操作回滾。如果為true,則未提交設定為待提交而不是回滾。
forceIgnoreUnresolvedTransactions false 官方文件建議這個不要設定為true

其他資料來源配置

引數 預設值 解釋
checkoutTimeout 0 當連線池用完時客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。
factoryClassLocation 0 指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那麼無需設定,預設null即可
numHelperThreads 3 c3p0是非同步操作的,緩慢的JDBC操作通過幫助程序完成。擴充套件這些操作可以有效的提升效能通過多執行緒實現多個操作同時被執行