C3P0:是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。
使用步驟
-
導入jar包: c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar、mysql-connector-java-5.1.48.jar
-
定於配置文件:可以命名為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>
-
創建數據庫連接池對象
DataSource dataSource = new ComboPooledDataSource();
-
獲取數據庫連接對象
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();
}
}
}