通用数据库连接池-C3PO

 C3PO是一个开放源代码的JDBC数据连接池实现项目,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。开源项目在使用:Hibernate,Spring,MYSQL等。

下载:

     https://sourceforge.net/projects/c3p0/files/latest/download?source=files二进制包。

目录:

   

其中的doc为说明文档,examples是自带的例子,lib是一些jar包,src是源码jar包。

简单使用实例(配置Oracle数据源):

[java] view plain copy
 
  1. import java.beans.PropertyVetoException;  
  2. import java.sql.Connection;  
  3. import java.sql.SQLException;  
  4.   
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  6. import com.mchange.v2.c3p0.DataSources;  
  7.   
  8. public class Test {  
  9.     public static void main(String[] args) {  
  10.         ComboPooledDataSource cpds = new ComboPooledDataSource();  
  11.         try {  
  12.             // 数据源进行各种有效的控制:  
  13.             // 设置驱动  
  14.             cpds.setDriverClass("oracle.jdbc.driver.OracleDriver");  
  15.             // 设置数据库URL  
  16.             cpds.setJdbcUrl("jdbc:oracle:thin:@10.2.4.77:1521:ORCL");  
  17.             // 设置用户名  
  18.             cpds.setUser("**********");  
  19.             // 设置密码  
  20.             cpds.setPassword("**********");  
  21.             // 当连接池中的连接用完时,C3PO一次性创建新的连接数目;  
  22.             cpds.setAcquireIncrement(3);  
  23.             // 定义在从数据库获取新的连接失败后重复尝试获取的次数,默认为30;  
  24.             cpds.setAcquireRetryAttempts(30);  
  25.             // 两次连接中间隔时间默认为1000毫秒  
  26.             cpds.setAcquireRetryDelay(1000);  
  27.             // 连接关闭时默认将所有未提交的操作回滚 默认为false;  
  28.             cpds.setAutoCommitOnClose(false);  
  29.             // 获取连接失败将会引起所有等待获取连接的线程异常,但是数据源仍有效的保留,并在下次调用getConnection()的时候继续尝试获取连接.如果设为true,那么尝试获取连接失败后该数据源将申明已经断开并永久关闭.默认为false  
  30.             cpds.setBreakAfterAcquireFailure(false);  
  31.             // 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待.单位毫秒,默认为0  
  32.             cpds.setCheckoutTimeout(0);  
  33.             // 隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查;  
  34.             cpds.setIdleConnectionTestPeriod(0);  
  35.             // 初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值.默认为3  
  36.             cpds.setInitialPoolSize(10);  
  37.             // 最大空闲时间,超过空闲时间的连接将被丢弃.为0或负数据则永不丢弃.默认为0;  
  38.             cpds.setMaxIdleTime(0);  
  39.             // 连接池中保留的最大连接数据.默认为15  
  40.             cpds.setMaxPoolSize(20);  
  41.             // JDBC的标准参数,用以控制数据源内加载的PreparedStatement数据.但由于预缓存的Statement属于单个Connection而不是整个连接池.所以设置这个参数需要考滤到多方面的因素,如果maxStatements  
  42.             // 与maxStatementsPerConnection均为0,则缓存被关闭.默认为0;  
  43.             cpds.setMaxStatements(0);  
  44.             // 连接池内单个连接所拥有的最大缓存被关闭.默认为0;  
  45.             cpds.setMaxStatementsPerConnection(0);  
  46.             // C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成.扩展这些操作可以有效的提升性能,通过多数程实现多个操作同时被执行.默为为3  
  47.             cpds.setNumHelperThreads(3);  
  48.             // 用户修改系统配置参数执行前最多等待的秒数.默认为300;  
  49.             cpds.setPropertyCycle(300);  
  50.             // 获取数据连接  
  51.             Connection conn = cpds.getConnection();  
  52.             if ( conn != null) {  
  53.                 System.out.println("OK");  
  54.                 // 关闭连接,当前连接被连接池收回  
  55.                 conn.close();  
  56.             }  
  57.   
  58.         } catch (PropertyVetoException e) {  
  59.             e.printStackTrace();  
  60.         } catch (SQLException e) {  
  61.             e.printStackTrace();  
  62.         } finally {  
  63.             try {  
  64.                 //关闭数据连接池  
  65.                 DataSources.destroy(cpds);  
  66.             } catch (SQLException e) {  
  67.                 e.printStackTrace();  
  68.             }  
  69.         }  
  70.     }  
  71. }   

 注意除了导入c3p0-0.9.1.2.jar外还要导放log4j的包和数据库驱动包.

使用实例二:

将lib下的c3p0-0.9.5.2.jar和mchange-commons-java-0.2.11.jar导入eclipse中,并在工程的src下新建一个名为c3p0-config.xml,且内容为:

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

  <named-config name="mvcApp"> 

      <propertyname="user">root</property>

      <propertyname="password">123456</property>

      <propertyname="driverClass">com.mysql.jdbc.Driver</property>

      <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/java</property>

<!—以上的user是数据库的用户,password是数据库的密码,driverClass是mysql的数据库驱动,jdbcUrl是连接数据库的url -->

       <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->

<propertyname="acquireIncrement">5</property>

<!--初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间 -->

<propertyname="initialPoolSize">10</property>

<!--连接池中保留的最小连接数 -->

<propertyname="minPoolSize">10</property>

<!--连接池中保留的最大连接数 -->

<propertyname="maxPoolSize">50</property>

<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->

<propertyname="maxStatements">20</property> 

<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->

<propertyname="maxStatementsPerConnection">5</property>

  </named-config>

</c3p0-config>

④在工程中新建一个JdbcUtils的工具类,代码如下:

import java.sql.Connection;

import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {

       /**

        * 释放连接

        * @param connection

        */

       public staticvoid releaseConnection(Connection connection){

              try {

                     if(connection != null ) {

                            connection.close();

                     }

              }catch (Exception e) {

                     e.printStackTrace();

              }

       }

       privatestatic DataSource dataSource = null;

       static{

              //dataSource资源只能初始化一次

              dataSource= new ComboPooledDataSource("mvcApp");

       }

       /**

        * 获取连接

        * @return

        * @throws SQLException

        */

       public staticConnection getConnection() throws SQLException{

              returndataSource.getConnection();

       }

}

其中的mvcApp是c3p0-config.xml中named-config的name值。DataSource的实例使用ComboPooledDataSource来生成的,这样我们就可以创建一个连接池,从而减少数据库连接时间。

最后,c3p0相似的dbcp和proxool连接池,详见:

dbcp::http://baike.baidu.com/view/920072.htm

proxool:http://baike.baidu.com/view/2098784.htm

原文地址:https://www.cnblogs.com/csguo/p/7655052.html