数据库连接池 —— 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
    
      
      <default-config>
          
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/Study
        登录数据库的用户
        登录数据库的密码
        
        
        5
        10
        3000
      default-config>
    
       
        
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/Study
        登录数据库的用户
        登录数据库的密码
        
        
        5
        8
        1000
      
    

     

  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驱动

com.mysql.jdbc.Driver

 

要连接的数据库地址

jdbc:mysql://localhost:3306/Study

 

登录数据库时的用户名

登录数据库的用户

 

登录数据库是用户名对应的密码

登录数据库的密码

 

初始化申请的数据库连接数量

最小数量

 

最大的数据库连接数量

最大数量

 

毫秒为单位的超时时间

超时时间

 

默认配置

<default-config>

      .......

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

}

 

                 

你可能感兴趣的:(数据库连接池 —— C3P0的简单使用)