zoukankan      html  css  js  c++  java
  • 数据库连接池 —— 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();
            }
        }
    
    }

                     

  • 相关阅读:
    python开发初识函数:函数定义,返回值,参数
    py基础2--列表,元祖,字典,集合,文件
    python中的urlencode与urldecode
    使用pymysql进行mysql数据库操作
    docker 命令
    docker镜象
    docker的安装
    JS中的prototype(原文地址:http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html)
    linux远程复制和压缩文件的命令
    rosbag 初尝试
  • 原文地址:https://www.cnblogs.com/liyihua/p/12327726.html
Copyright © 2011-2022 走看看