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(); } } }