zoukankan      html  css  js  c++  java
  • 通用数据库连接池-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

  • 相关阅读:
    [Swift]LeetCode1099. 小于 K 的两数之和 | Two Sum Less Than K
    转 用好HugePage,告别Linux性能故障
    子shell
    转 【推荐】 RAC 性能优化全攻略与经典案例剖析
    转 shell模拟数据库的读写
    c 语言写的高级Oracle&#174;数据库调优及监控工具
    crontab 在unix 没有执行。
    Oracle 云计算
    aix 推荐使用重启
    linux 打开FTP 功能
  • 原文地址:https://www.cnblogs.com/csguo/p/7655052.html
Copyright © 2011-2022 走看看