数据库连接池(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();
        }
    }

}
posted @ 2020-02-18 20:10  LeeHua  阅读(1368)  评论(0编辑  收藏  举报