數據庫連接池(C3P0的簡單使用)


C3P0:是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。

使用步驟

  1. 導入jar包: c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar、mysql-connector-java-5.1.48.jar

  2. 定於配置文件:可以命名為c3p0-config.xml

    <c3p0-config>
      <!-- 使用默認的配置讀取連接池對象 -->
      <default-config>
          <!--  連接參數 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>
        <property name="user">登錄數據庫的用戶</property>
        <property name="password">登錄數據庫的密碼</property>
        
        <!-- 連接池參數 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
      <named-config name="otherc3p0"> 
        <!--  連接參數 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>
        <property name="user">登錄數據庫的用戶</property>
        <property name="password">登錄數據庫的密碼</property>
        
        <!-- 連接池參數 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">1000</property>
      </named-config>
    </c3p0-config>
    
  3. 創建數據庫連接池對象

    DataSource dataSource =  new ComboPooledDataSource();
    
  4. 獲取數據庫連接對象

    Connection connection = dataSource.getConnection();
    

舉例如下:

package my.view.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo01 {

    public static void main(String[] args) throws SQLException {
        // 創建數據庫連接池對象
        DataSource dataSource =  new ComboPooledDataSource();

        // 獲取一個連接對象
        Connection connection = dataSource.getConnection();

        // 打印獲取的連接對象的地址值
        System.out.println(connection);
    }

}

配置文件說明

獲取MySQL驅動

<property name="driverClass">com.mysql.jdbc.Driver</property>

要連接的數據庫地址

<property name="jdbcUrl">jdbc:mysql://localhost:3306/Study</property>

登錄數據庫時的用戶名

<property name="user">登錄數據庫的用戶</property>

登錄數據庫是用戶名對應的密碼

<property name="password">登錄數據庫的密碼</property>

初始化申請的數據庫連接數量

<property name="initialPoolSize">最小數量</property>

最大的數據庫連接數量

<property name="maxPoolSize">最大數量</property>

毫秒為單位的超時時間

<property name="checkoutTimeout">超時時間</property>

默認配置

<default-config>

      .......

</default-config>

指定名稱配置

<named-config name="名稱"> 

       ......

</named-config>

配置的使用

使用默認配置

// 創建數據庫連接池對象
DataSource dataSource =  new ComboPooledDataSource();

使用指定名稱配置

// 創建數據庫連接池對象
DataSource dataSource =  new ComboPooledDataSource("名稱");

舉例

如c3p0-config.xml中的默認配置,最大數據庫連接對象是10個。

獲取10個數據庫連接對象:

package my.view.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo02 {

    public static void main(String[] args) throws SQLException {
        // 創建數據庫連接池對象
        DataSource dataSource =  new ComboPooledDataSource();

        for (int i = 0; i < 10; i++) {
            // 獲取一個連接對象
            Connection connection = dataSource.getConnection();

            // 打印獲取的連接對象的地址值
            System.out.println(i + " ———— " + connection);
        }
    }

}

運行程序,控制台輸出連接池中獲取的所有數據庫連接對象的地址值:

0 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@71e7a66b [wrapping: com.mysql.jdbc.JDBC4Connection@2ac1fdc4]
1 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@1c53fd30 [wrapping: com.mysql.jdbc.JDBC4Connection@50cbc42f]
2 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@282ba1e [wrapping: com.mysql.jdbc.JDBC4Connection@13b6d03]
5 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@326de728 [wrapping: com.mysql.jdbc.JDBC4Connection@25618e91]
6 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@71f2a7d5 [wrapping: com.mysql.jdbc.JDBC4Connection@2cfb4a64]
7 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@4b6995df [wrapping: com.mysql.jdbc.JDBC4Connection@2fc14f68]
8 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@66048bfd [wrapping: com.mysql.jdbc.JDBC4Connection@61443d8f]
9 ———— com.mchange.v2.c3p0.impl.NewProxyConnection@61a52fbd [wrapping: com.mysql.jdbc.JDBC4Connection@233c0b17]

獲取超過10個數據庫連接對象,如獲取11個數據庫連接池對象,運行程序,會拋出異常:

Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

獲取第11個熟即可連接池對象的時候,超時(如上配置的超時時間為3秒鍾)。那么該如何解決呢?很簡單,我獲取完一個數據連接池對象,就歸還給數據庫連接池即可,保證數據庫連接池有數據庫連接對象可以獲取,操作如下:

package my.view.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo03 {

    public static void main(String[] args) throws SQLException {
        // 創建數據庫連接池對象
        DataSource dataSource =  new ComboPooledDataSource();

        for (int i = 0; i < 11; i++) {
            // 獲取一個連接對象
            Connection connection = dataSource.getConnection();

            // 打印獲取的連接對象的地址值
            System.out.println(i + " ———— " + connection);

            // 將獲取到的數據庫連接對象歸還給數據庫連接池
            connection.close();
        }
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM