• 数据库程序接口——JDBC——功能第二篇——数据源之C3P0数据源


    综述                                                               

    C3P0由三部分内容组成。实例化对象,各配置项的含义,以及加载配置项的方式。

    实例化对象的方式有三种,第一种方式直接new ComboPooledDataSource,第二种方式使用工厂类DataSources.poolDataSource方法。第三种不常见。第一种方式是最方便的方式。

    C3P0的配置项主要有:

    1. 连接数据库的必要属性:例如jdbcUrl,user,password等。
    2. 连接池的大小配置。例如initialPoolSize
    3. 连接对象的生命周期。例如maxConnectionAge。
    4. 测试连接的配置,例如preferredTestQuery指定测试SQL语句。
    5. 重连策略的配置,例如acquireRetryAttempts指定重连次数。
    6. statement对象的配置,例如maxStatements指定最大Statement的总数。
    7. 线程配置,例如numHelperThread指定连接池拥有的线程数量。
    8. 事务配置,例如autoCommitOnClose指定是否在回收连接对象时自动提交事务。
    9. 调试模式,例如debugUnreturnedConnectionStackTraces为true时,会打印所有从连接池获取连接对象的记录。
    10. 监听类的设置,例如connectionCustomizerClassName指定监听类的名称,该类可以实现onAcquire,onDestory等方法。
    11. 日志的设置,例如com.mchange.v2.log.MLog指定日志的实现方式。常见的有log4J,commonLogging等。

    配置项常见的加载方式有三种:

    1. 代码方式:通过实例对象调用setXX方法。
    2. properties文件:这种方式需要properties文件的名称必须为c3p0.properties,而且该文件必须在类加载路径下。
    3. xml文件:这种方式需要文件名称为c3p0-config.xml,路径由com.mchange.v2.c3p0.cfg.xml指定。

    实例化                                                                  

    实例化ComboPooledDataSource

     1 // 创建实例,dataSourceName指定数据源的名称
     2 ComboPooledDataSource dataSource = new ComboPooledDataSource(dataSourceName);
     3 // 设置数据库url
     4 dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:masteroracle");
     5 // 设置数据库驱动类
     6 dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
     7 // 设置用户名
     8 dataSource.setUser("system");
     9 // 设置密码
    10 dataSource.setPassword("password");
    11 Connection conn = dataSource.getConnection();
    12 runSQLTest(conn);

    工厂DataSources方式

     1 // 创建unpooled的数据源
     2 DataSource ds_unpooled = DataSources.unpooledDataSource(jdbcUrl, user, password);
     3 // pooled数据源的参数
     4 Map<String,String> paramMap = new HashMap<>();
     5 DataSource pooled = DataSources.pooledDataSource(ds_unpooled,paramMap);
     6 Connection conn = pooled.getConnection();
     7 runSQLTest(conn);
     8 conn.close();
     9 DataSources.destroy(pooled);
    10 return pooled;

    配置项的含义                                                     

          C3P0各配置项的前缀为c3p0。如果指定dataSourceName,前缀为c3p0.named-configs.dataSourceName。如果存在多个用户,用户可以覆盖默认的配置项,前缀为c3p0.user-overrides.user。

    Java代码方式

     1     /** -----------------------配置数据源----------------------------- **/
     2     /**
     3      * 配置数据源
     4      * 
     5      * @param dataSource
     6      * @return
     7      * @throws PropertyVetoException
     8      */
     9     public static ComboPooledDataSource configDataSource(ComboPooledDataSource dataSource)
    10             throws PropertyVetoException {
    11         // 连接数据库的必要属性
    12         connDatabaseConfig(dataSource,"masterOracle");
    13         // 连接池的相关配置
    14         connPoolConfig(dataSource);
    15         // 连接对象的生命周期配置
    16         connAgeConfig(dataSource);
    17         // 测试连接的配置
    18         connTestConfig(dataSource);
    19         // statement对象的配置
    20         statementConfig(dataSource);
    21         // 重连配置
    22         reconnConfig(dataSource);
    23         // 连接的监听类配置
    24         connListenerConfig(dataSource);
    25         // 事务的配置
    26         tranConfig(dataSource);
    27         // 调试模式
    28         debugMode(dataSource);
    29         // 线程配置
    30         threadConfig(dataSource);
    31         return dataSource;
    32

    连接必要属性

    1. driverClassName:驱动类的名称,包名+类名
    2. jdbcUrl:数据库实例的url地址,格式为jdbc:subprotocol:subname。其中subprotocol表示连接方式。
    3. user:用户名
    4. password:密码。

    C3P0.properties的方式

    ##-------------------------------数据库连接属性-----------------------------------##
    # 驱动类名称
    c3p0.driverClass=oracle.jdbc.driver.OracleDriver
    # 数据库实例url地址
    c3p0.jdbcUrl=jdbc:oracle:thin:@localhost:1521:masteroracle
    # 用户名
    c3p0.user=system
    # 密码
    c3p0.password=password

    代码方式

     1         // 设置数据库url
     2         dataSource.setJdbcUrl(jdbcUrl);
     3         // 设置数据库驱动类
     4         dataSource.setDriverClass(driverClassName);
     5         // 设置用户名
     6         dataSource.setUser(user);
     7         // 设置密码
     8         dataSource.setPassword(password);
     9         // 输出dataSourceName,在初始化ComboPooledDataSource时,字符串参数作为数据源名称,
    10         dataSource.getDataSourceName();
    View Code

    连接池大小

    1. initialPoolSize:连接池的初始需求量大小,实际创建的连接对象小于需求量大小。
    2. minPoolSize:连接池连接数量的最小值。
    3. maxPoolSize:连接池连接数量的最大值。
    4. acquireIncrement:当实际连接不够用时,调整需求量的大小,需求量的递增值。

    C3P0.properties的方式

    ##-------------------------------连接池配置-------------------------------------##
    # 连接池拥有连接对象的初始值,这种情形下只是Acquire(需求)的初始值,真正创建对象会根据Acquire来按需创建
    c3p0.initialPoolSize=10
    # 连接池拥有连接对象的最大值,默认值为3
    c3p0.maxPoolSize=20
    # 连接池拥有连接对象的最小值,默认值为3
    c3p0.minPoolSize=5
    # 当无空闲连接时,新创建的连接数,默认值为3
    c3p0.acquireIncrement=3

    代码方式

     1     /**
     2      * 连接池的配置 initialPoolSize:连接池的初始值 maxPoolSize:连接池的最大值 minPoolSize:连接池的最小值
     3      * 
     4      * @param dataSource
     5      */
     6     private static void connPoolConfig(ComboPooledDataSource dataSource) {
     7         // 连接池的初始值,默认值为3
     8         dataSource.setInitialPoolSize(10);
     9         // 连接池的最大值,默认值为0
    10         dataSource.setMaxPoolSize(20);
    11         // 连接池的最小值,最小值为3
    12         dataSource.setMinPoolSize(1);
    13         // 连接池的递增值,默认值为3
    14         dataSource.setAcquireIncrement(5);
    15     }
    View Code

    连接生命周期

    1. maxIdleTime:空闲连接对象的超时时间,当连接对象处于空闲状态的时间超过此时间,连接池销毁该连接对象。
    2. maxConnectionAge:连接对象的最大生命值,从创建连接对象开始计算。当超出此时间,销毁连接对象。与maxIdleTime的区别在于maxIdleTime只适用于空闲连接对象,而且是从空闲状态开始计算时间。
    3. maxIdleTimeExcessConnections:当连接池负载较低时,空闲连接对象的超时时间,设置此项可以在负载较低时,快速的释放链接。
    4. unreturnedConnectionTimeout:连接对象的最大使用时间。从连接池中获取连接对象开始计算,如果超出此时间,该连接对象还没有被连接池回收,那么连接池创建新连接对象替换旧连接对象。

    C3P0.proerties的方式

    ##-------------------------------连接池中连接对象的生命周期--------------------------##
    # 连接对象的最大生存时间,起始时间从连接池从数据库中创建连接对象开始计算。0表示永远不销毁
    c3p0.maxConnectionAge=0
    # 空闲连接对象的超时时间,起始时间从连接对象状态变为空闲时起计算。
    c3p0.maxIdleTime=1800
    # 当连接池不处于满载状态时,空闲连接对象的最大生存时间,设置此值,可以快速的减少连接池的大小
    c3p0.maxIdleTimeExcessConnections=60
    # 连接对象回收的超时时间,当连接池无法在一定时间内回收连接对象时,销毁旧对象,重新创建新对象
    c3p0.unreturnedConnectionTimeout=600

    代码方式

        /**
         * 连接池生命周期配置,连接池首先从数据库中获取连接,用户请求时从连接池中获取连接。默认值为0,表示永不过期。 maxConnectionAge:
         * 连接对象生命的最大值,超过此时间,连接池会销毁连接对象,连接池变小。单位为秒,建议设置1800或更多 maxIdleTime:
         * 空闲连接在连接池中的超时时间,超过此时间,连接池将会销毁连接对象。单位为秒,建议设置1800或更多
         * maxIdleTimeExcessConnections:当连接池不处于过载状态时,空闲连接对象生命的最大值。
         * unreturnedConnectionTimeout:当连接对象在一定时间内无法回收,则创建新连接对象,销毁旧连接对象
         * 
         * @param dataSource
         */
        private static void connAgeConfig(ComboPooledDataSource dataSource) {
            // 连接对象生命的最大值,它指绝对时间。从创建开始时计算,默认值为0
            dataSource.setMaxConnectionAge(10 * 60 * 60);
            // 空闲连接的超时时间,从连接池变为空闲状态开始计算
            dataSource.setMaxIdleTime(1800);
            // 空闲连接对象生命的最大值
            dataSource.setMaxIdleTimeExcessConnections(60);
            // 连接对象的最大使用时间,设置为2小时
            dataSource.setUnreturnedConnectionTimeout(2 * 60 * 60);
        }
    View Code

    测试连接

    1. automaticTestTable:测试连接使用的数据库表
    2. connectionTesterClassName:测试连接使用的类名称
    3. idleConnectionTestPeriod:测试连接的时间间隔,在此间隔内不执行连接测试
    4. preferredTestQuery:SELECT 1。如果支持JDBC 4,会使用Connection.isAlive方法不设置此值。
    5. testConnectionOnCheckin:是否在连接池中回收连接对象时进行连接测试,
    6. testConnectionOnCheckOut:从连接池中取出连接对象时进行连接测试。

    C3P0.properties的方式

    ##-------------------------------测试连接配置项----------------------------------##
    # 从连接池中获取连接对象时进行连接测试
    c3p0.testConnectionOnCheckout=true
    # 从连接池回收对象时进行连接测试
    c3p0.testConnectionOnCheckin=true
    # 连接测试的间隔,在这一段时间内不进行连接测试
    c3p0.idleConnectionTestPeriod=60
    # 连接测试时使用的类,设置此值时忽略preferredTestQuery,automaticTestTable等属性值
    #c3p0.connectionTesterClassName=com.rain.Tester.ConnectionTesterSample
    # 测试的SQL语句
    c3p0.preferredTestQuery=select 1
    # 连接测试时使用的数据库表
    c3p0.automaticTestTable=test

    代码方式

        /**
         * 连接测试配置。 automaticTestTable:测试连接时使用的数据库表 ,默认值为null。connectionTesterClassName:测试连接时使用的类名称
         * idleConnectionTestPeriod:测试连接间隔时间。在此段时间内不进行连接测试。 preferredTestQuery:连接测试使用的SQL语句。默认语句为select
         * 1 from dual。 testConnectionOnCheckin:从连接池回收连接对象时测试连接。默认值为false
         * testConnectionOnCheckOut:从连接池取出连接对象时测试连接。默认值为false。
         * forceSynchronousCheckins:连接池回收连接对象时是同步,还是异步,默认是异步。默认值为false
         * 
         * @param dataSource
         * @throws PropertyVetoException
         */
        private static void connTestConfig(ComboPooledDataSource dataSource)
                throws PropertyVetoException {
            // 连接测试使用的数据库表,默认值为Null
            dataSource.setAutomaticTestTable("dual");
            // 连接测试使用的SQL语句,默认使用Connection对象的isAlive方法,所以一般不设置此值,默认值为null
            dataSource.setPreferredTestQuery("select 1");
            // 从连接池取出连接时测试连接,默认值为false
            dataSource.setTestConnectionOnCheckout(true);
            // 从连接池回收连接时测试连接,默认值为false。
            dataSource.setTestConnectionOnCheckin(true);
            // 测试连接的间隔时间,默认值为0
            dataSource.setIdleConnectionTestPeriod(60);
            // 测试连接使用的类名称
            dataSource.setConnectionTesterClassName("com.rain.Tester.ConnectionTesterSample");
        }
    View Code

    重连策略

    1. acquireRetryAttempts:连接失败后,重连次数
    2. acquireRetryDelay:第一次重连与第二次重连的时间间隔。单位为毫秒
    3. checkTimeOut:等待连接的超时时间,超出此时间后不在进行重连。
    4. breakAfterAcquireFailure:当连接失败后,是否销毁数据源对象,true表示是,false表示否。

    C3P0.properties

    ##-------------------------------重新连接---------------------------------------##
    # 重新连接的次数
    c3p0.acquireRetryAttempts=5
    # 重新连接的时间间隔,单位为毫秒
    c3p0.acquireRetryDelay=3000
    # 等待连接响应的超时时间
    c3p0.checkoutTimeout=120
    # 当连接失败时,是否销毁数据源对象,true表示是,false表示否
    c3p0.breakAfterAcquireFailure=true

    代码方式

        /**
         * 当连接失败后,重新连接的配置。 acquireRetryAttempts:重连的次数。 acquireRetryDelay:重连的时间间隔。单位为毫秒
         * breakAfterAcquireFailure:重连失败后,如果此值设置为false,数据源对象不会销毁,设置为false。数据源被销毁。
         * checkoutTimeout:等待连接响应的时间。
         */
        private static void reconnConfig(ComboPooledDataSource dataSource) {
            // 设置重连次数为3,默认值为30
            dataSource.setAcquireRetryAttempts(3);
            // 设置重连的时间间隔为2秒,默认值为1000
            dataSource.setAcquireRetryDelay(2000);
            // 等待连接响应的超时时间。默认值为0表示永远不超时
            dataSource.setCheckoutTimeout(4);
            // 重连失败后,销毁数据源。默认值为false
            dataSource.setBreakAfterAcquireFailure(true);
        }
    View Code

    Statement配置

    1. maxStatements:连接池缓存PreparedStatement对象的总数
    2. maxStatementsPerConnection:每个连接缓存PreparedStatement的最大值。
    3. statementCacheNumDeferredCloseThreads:当Connection关闭时,有可能会产生Statement对象没有关闭的情形,此时需要额外线程确保Statement对象在Connection关闭时正在关闭。一般配置为0或1

    C3P0.properties的方式

    ##-------------------------------statement对象相关配置---------------------------##
    # c3p0拥有的PreparedStatement对象的总数
    c3p0.maxStatements=100
    # 每个连接拥有PreparedStament对象的数量
    c3p0.maxStatementsPerConnection=10
    # 当Connection对象关闭时,启动额外线程确保statement对象关闭
    # This parameter should only be set if you observe that attempts by c3p0 to close() cached #statements freeze
    statementCacheNumDeferredCloseThreads=1

    代码方式

     1     /**
     2      * 连接池中PreparedStatement对象的配置 PreparedStatement对象的配置。 maxStatements:连接池拥有PreparedStatement对象的总数。
     3      * maxStatementsPerConnections:每个连接拥有PreparedStatement对象的数目。
     4      * 
     5      * @param dataSource
     6      */
     7     private static void statementConfig(ComboPooledDataSource dataSource) {
     8         // 设置PreparedStatement对象的总数,默认值为0,表示关闭
     9         dataSource.setMaxStatements(100);
    10         // 设置每个连接拥有Statement对象的数目,默认值为0,表示关闭。
    11         dataSource.setMaxStatementsPerConnection(15);
    12     }
    View Code

    线程配置

    1. numHelperThreads:连接池拥有的线程数量。
    2. maxAdministrativeTaskTime:线程执行任务的超时时间,当超出此时间时,会销毁该线程,重新创建新线程。
    3. forceSynchronousCheckins:连接池回收连接对象时默认是同步方式执行连接测试,此值设置为true时,连接测试与回收连接对象是异步执行的。

    C3P0.properties的方式

    ##-------------------------------线程池----------------------------------------##
    # 连接池拥有的线程数量
    c3p0.numHelperThreads=5
    # 线程执行的最大时间
    c3p0.maxAdministrativeTaskTime=600
    # 启动独立的线程来在连接被连接池回收阶段进行测试
    forceSynchronousCheckins=true

    代码方式

     1     /**
     2      * 连接池的线程设置 numHelperThread:连接池拥有的线程数量 maxAdministrativeTaskTime:线程执行的超时时间。
     3      * 
     4      * @param dataSource
     5      */
     6     private static void threadConfig(ComboPooledDataSource dataSource) {
     7         // 设置线程数量为10,默认值为3
     8         dataSource.setNumHelperThreads(10);
     9         // 设置线程的超时时间,默认值为0,设置为5分钟
    10         dataSource.setMaxAdministrativeTaskTime(5 * 60);
    11     }
    View Code

    事务配置

    1. autoCommitOnClose:回收连接对象时,是否自动提交事务。默认不配置,通过其他方式管理事务,例如Spring事务
    2. forceIgnoreUnresolvedTransactions:回收连接对象时,是否强制回滚或者提交事务,默认不配置。

    C3P0.properties的方式

    ##-------------------------------事务-----------------------------------------##
    # 交给Spring去管理事务,默认不配置这些项
    # 连接关闭时,是否自动提交事务
    c3p0.autoCommitOnClose=false
    # 连接回收时,是否强制提交或者回滚当前连接拥有的事务,默认不配置。
    c3p0.forceIgnoreUnresolvedTransactions=false

    代码方式

     1     /**
     2      * 连接对象的事务配置 autoCommitOnClose:是否自动提交事务,true为是,false为否,默认为否 forceIgnoreUnresolvedTransactions
     3      * 回收连接时,是否强制回滚或提交事务,默认为false。一般不设置此值, 例如由Spring来管理事务
     4      * 
     5      * @param dataSource
     6      */
     7     private static void tranConfig(ComboPooledDataSource dataSource) {
     8         // 关闭自动提交事务,默认值为false
     9         dataSource.setAutoCommitOnClose(false);
    10         // 回收连接时,是否强制回滚或提交事务,设置为false。
    11         dataSource.setForceIgnoreUnresolvedTransactions(false);
    12 
    13     }
    View Code

    调试模式

    1. debugUnreturnedConnectionStackTraces:打印从连接池获取连接对象的所有信息。

    C3P0.properties的方式

    ##-------------------------------调试模式--------------------------------------##
    # 当从连接池获取连接对象时,打印所有信息。
    c3p0.debugUnreturnedConnectionStackTraces=true

    代码方式

     1     /**
     2      * 调试模式的设置 debugUnreturnedConnectionStackTraces:从连接池获取连接对象时,打印所有信息
     3 
     4      * 
     5      * @param dataSource
     6      */
     7     private static void debugMode(ComboPooledDataSource dataSource) {
     8         // 从连接池获取连接对象时,打印所有信息
     9         dataSource.setDebugUnreturnedConnectionStackTraces(true);
    10     }
    View Code

    监听类

    connectionCustomizerClassName:监听类的名称,监听类继承自AbstractConnectionCustomizer,监听类有四个方法

    1. onAcquire在数据库中创建连接对象时触发。
    2. onDestory在连接池中销毁连接对象时触发。
    3. onCheckOut从连接池获取连接对象时触发
    4. onCheckIn 从连接池回收连接对象时触发。

    C3P0.properties的方式

    ##-------------------------------监听类---------------------------------------##
    c3p0.connectionCustomizerClassName=com.rain.Tester.ConnCustomrizerSample

    代码方式

    1     /**
    2      * 设置连接对象的监听类,该类有四个方法 onAcquire:表示当连接池从数据库中获得连接时 onDestory:表示当连接池销毁连接对象时 onCheckOut:从连接池中获取连接对象时
    3      * onCheckIn:连接池回收连接对象时。
    4      */
    5     private static void connListenerConfig(ComboPooledDataSource dataSource) {
    6         // 设置连接对象的监听类
    7         dataSource.setConnectionCustomizerClassName("com.rain.Tester.ConnCustomrizerSample");
    8     }
    View Code

    日志配置

    1. com.mchange.v2.log.MLog:日志的实现方式
    2. com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL:日志的级别。可选值为OFF,SERVER,WARNING,INFO,FINE,FINER,FINEST,ALL
    3. com.mchange.v2.log.NameTransformer:日志按每个数据源类输出,还是按包。com.mchange.v2.log.PackageNames表示按包,默认的方式按类的方式
    4. com.mchange.v2.log.jdk14logging.suppressStackWalk:是否显示哪些类,哪些方法产生的日志,true表示不显示,false表示显示,默认值为true。

    C3P0.properties的方式

    ##-------------------------------日志配置--------------------------------------##
    # 日志的实现方式
    com.mchange.v2.log.MLog=log4j
    # 日志的级别,OFF,SERVER,WARNING,INFO,FINE,FINER,FINEST,ALL
    com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=All
    # 日志按包输出
    com.mchange.v2.log.NameTransformer=com.mchange.v2.log.PackageNames
    # determine the class and method from which a log message was generated,当为true时,不打印这些日志信息
    com.mchange.v2.log.jdk14logging.suppressStackWalk=true

    加载配置项的方式                                                  

    代码方式:通过new实例化dataSource,调用setXX方法。

      1 package com.rain.core;
      2 
      3 import java.beans.PropertyVetoException;
      4 import java.io.IOException;
      5 import java.sql.Connection;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 import java.sql.Statement;
      9 import java.util.HashMap;
     10 import java.util.Map;
     11 import javax.sql.DataSource;
     12 import com.mchange.v2.c3p0.ComboPooledDataSource;
     13 import com.mchange.v2.c3p0.DataSources;
     14 
     15 public class C3P0DataSourceSample {
     16     private static final String masterOraclejdbcUrl =
     17             "jdbc:oracle:thin:@localhost:1521:masteroracle";
     18     private static final String orclJdbcUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
     19     private static final String driverClassName = "oracle.jdbc.driver.OracleDriver";
     20     private static final String user = "system";
     21     private static final String password = "password";
     22 
     23     public static void main(String[] args) throws Exception {
     24         // 创建数据源对象
     25         ComboPooledDataSource dataSource = createByInitInstance();
     26         // 配置数据源
     27 //        configDataSource(dataSource);
     28         // 打印数据源信息
     29         printDataSourceInfo(dataSource);
     30         // 运行测试用例
     31         runSQLTest(dataSource);
     32     }
     33 
     34     /** -------------------------创建数据源------------------------- **/
     35     /**
     36      * 通过实例化的方式来获取数据源
     37      * 
     38      * @return
     39      * @throws PropertyVetoException
     40      * @throws SQLException
     41      */
     42     public static ComboPooledDataSource createByInitInstance()
     43             throws PropertyVetoException, SQLException {
     44         // 创建实例
     45         ComboPooledDataSource dataSource = new ComboPooledDataSource("");
     46         // 连接时配置
     47 //        dataSource = connDatabaseConfig(dataSource, "masterOracle");
     48         return dataSource;
     49     }
     50 
     51     /**
     52      * 创建多个数据源,每个数据源通过名字区分
     53      * 
     54      * @return
     55      * @throws IOException
     56      * @throws SQLException
     57      * @throws PropertyVetoException
     58      */
     59     public static ComboPooledDataSource createMultiDataSource()
     60             throws IOException, SQLException, PropertyVetoException {
     61         // 创建数据库实例masterOracle
     62         ComboPooledDataSource masterOracleDataSource = new ComboPooledDataSource("masterOracle");
     63         // 连接时配置masterOracle数据源
     64         masterOracleDataSource = connDatabaseConfig(masterOracleDataSource, "masterOracle");
     65         // 创建数据库实例orcl
     66         ComboPooledDataSource orclDataSource = new ComboPooledDataSource("orcl");
     67         // 连接时配置orcl数据源
     68         orclDataSource = connDatabaseConfig(orclDataSource, "orcl");
     69         // 执行测试语句
     70         runSQLTest(masterOracleDataSource);
     71         // 执行测试语句
     72         runSQLTest(orclDataSource);
     73         return masterOracleDataSource;
     74     }
     75 
     76     /**
     77      * 通过DataSources工厂方式建立连接
     78      * 
     79      * @return
     80      * @throws SQLException
     81      */
     82     public static DataSource createByFactory() throws SQLException {
     83         // 创建unpooled的数据源
     84         DataSource ds_unpooled =
     85                 DataSources.unpooledDataSource(masterOraclejdbcUrl, user, password);
     86         // pooled数据源的参数
     87         Map<String, String> paramMap = new HashMap<>();
     88         ComboPooledDataSource pooled =
     89                 (ComboPooledDataSource) DataSources.pooledDataSource(ds_unpooled, paramMap);
     90         runSQLTest(pooled);
     91         pooled.close();
     92         DataSources.destroy(pooled);
     93         return pooled;
     94     }
     95 
     96     /** -----------------------配置数据源----------------------------- **/
     97     /**
     98      * 配置数据源
     99      * 
    100      * @param dataSource
    101      * @return
    102      * @throws PropertyVetoException
    103      */
    104     public static ComboPooledDataSource configDataSource(ComboPooledDataSource dataSource)
    105             throws PropertyVetoException {
    106         // 连接数据库的必要属性
    107         connDatabaseConfig(dataSource,"masterOracle");
    108         // 连接池的相关配置
    109         connPoolConfig(dataSource);
    110         // 连接对象的生命周期配置
    111         connAgeConfig(dataSource);
    112         // 测试连接的配置
    113         connTestConfig(dataSource);
    114         // statement对象的配置
    115         statementConfig(dataSource);
    116         // 重连配置
    117         reconnConfig(dataSource);
    118         // 连接的监听类配置
    119         connListenerConfig(dataSource);
    120         // 事务的配置
    121         tranConfig(dataSource);
    122         // 调试模式
    123         debugMode(dataSource);
    124         // 线程配置
    125         threadConfig(dataSource);
    126         return dataSource;
    127     }
    128 
    129 
    130 
    131     /**
    132      * 连接池的配置 initialPoolSize:连接池的初始值 maxPoolSize:连接池的最大值 minPoolSize:连接池的最小值
    133      * 
    134      * @param dataSource
    135      */
    136     private static void connPoolConfig(ComboPooledDataSource dataSource) {
    137         // 连接池的初始值,默认值为3
    138         dataSource.setInitialPoolSize(10);
    139         // 连接池的最大值,默认值为0
    140         dataSource.setMaxPoolSize(20);
    141         // 连接池的最小值,最小值为3
    142         dataSource.setMinPoolSize(1);
    143         // 连接池的递增值,默认值为3
    144         dataSource.setAcquireIncrement(5);
    145     }
    146 
    147     /**
    148      * 连接池生命周期配置,连接池首先从数据库中获取连接,用户请求时从连接池中获取连接。默认值为0,表示永不过期。 maxConnectionAge:
    149      * 连接对象生命的最大值,超过此时间,连接池会销毁连接对象,连接池变小。单位为秒,建议设置1800或更多 maxIdleTime:
    150      * 空闲连接在连接池中的超时时间,超过此时间,连接池将会销毁连接对象。单位为秒,建议设置1800或更多
    151      * maxIdleTimeExcessConnections:当连接池不处于过载状态时,空闲连接对象生命的最大值。
    152      * unreturnedConnectionTimeout:当连接对象在一定时间内无法回收,则创建新连接对象,销毁旧连接对象
    153      * 
    154      * @param dataSource
    155      */
    156     private static void connAgeConfig(ComboPooledDataSource dataSource) {
    157         // 连接对象生命的最大值,它指绝对时间。从创建开始时计算,默认值为0
    158         dataSource.setMaxConnectionAge(10 * 60 * 60);
    159         // 空闲连接的超时时间,从连接池变为空闲状态开始计算
    160         dataSource.setMaxIdleTime(1800);
    161         // 空闲连接对象生命的最大值
    162         dataSource.setMaxIdleTimeExcessConnections(60);
    163         // 连接对象的最大使用时间,设置为2小时
    164         dataSource.setUnreturnedConnectionTimeout(2 * 60 * 60);
    165     }
    166 
    167 
    168     /**
    169      * 连接测试配置。 automaticTestTable:测试连接时使用的数据库表 ,默认值为null。connectionTesterClassName:测试连接时使用的类名称
    170      * idleConnectionTestPeriod:测试连接间隔时间。在此段时间内不进行连接测试。 preferredTestQuery:连接测试使用的SQL语句。默认语句为select
    171      * 1 from dual。 testConnectionOnCheckin:从连接池回收连接对象时测试连接。默认值为false
    172      * testConnectionOnCheckOut:从连接池取出连接对象时测试连接。默认值为false。
    173      * forceSynchronousCheckins:连接池回收连接对象时是同步,还是异步,默认是异步。默认值为false
    174      * 
    175      * @param dataSource
    176      * @throws PropertyVetoException
    177      */
    178     private static void connTestConfig(ComboPooledDataSource dataSource)
    179             throws PropertyVetoException {
    180         // 连接测试使用的数据库表,默认值为Null
    181         dataSource.setAutomaticTestTable("dual");
    182         // 连接测试使用的SQL语句,默认使用Connection对象的isAlive方法,所以一般不设置此值,默认值为null
    183         dataSource.setPreferredTestQuery("select 1");
    184         // 从连接池取出连接时测试连接,默认值为false
    185         dataSource.setTestConnectionOnCheckout(true);
    186         // 从连接池回收连接时测试连接,默认值为false。
    187         dataSource.setTestConnectionOnCheckin(true);
    188         // 测试连接的间隔时间,默认值为0
    189         dataSource.setIdleConnectionTestPeriod(60);
    190         // 测试连接使用的类名称
    191         dataSource.setConnectionTesterClassName("com.rain.Tester.ConnectionTesterSample");
    192     }
    193 
    194     /**
    195      * 连接池中PreparedStatement对象的配置 PreparedStatement对象的配置。 maxStatements:连接池拥有PreparedStatement对象的总数。
    196      * maxStatementsPerConnections:每个连接拥有PreparedStatement对象的数目。
    197      * 
    198      * @param dataSource
    199      */
    200     private static void statementConfig(ComboPooledDataSource dataSource) {
    201         // 设置PreparedStatement对象的总数,默认值为0,表示关闭
    202         dataSource.setMaxStatements(100);
    203         // 设置每个连接拥有Statement对象的数目,默认值为0,表示关闭。
    204         dataSource.setMaxStatementsPerConnection(15);
    205     }
    206 
    207     /**
    208      * 当连接失败后,重新连接的配置。 acquireRetryAttempts:重连的次数。 acquireRetryDelay:重连的时间间隔。单位为毫秒
    209      * breakAfterAcquireFailure:重连失败后,如果此值设置为false,数据源对象不会销毁,设置为false。数据源被销毁。
    210      * checkoutTimeout:等待连接响应的时间。
    211      */
    212     private static void reconnConfig(ComboPooledDataSource dataSource) {
    213         // 设置重连次数为3,默认值为30
    214         dataSource.setAcquireRetryAttempts(3);
    215         // 设置重连的时间间隔为2秒,默认值为1000
    216         dataSource.setAcquireRetryDelay(2000);
    217         // 等待连接响应的超时时间。默认值为0表示永远不超时
    218         dataSource.setCheckoutTimeout(4);
    219         // 重连失败后,销毁数据源。默认值为false
    220         dataSource.setBreakAfterAcquireFailure(true);
    221     }
    222 
    223     /**
    224      * 设置连接对象的监听类,该类有四个方法 onAcquire:表示当连接池从数据库中获得连接时 onDestory:表示当连接池销毁连接对象时 onCheckOut:从连接池中获取连接对象时
    225      * onCheckIn:连接池回收连接对象时。
    226      */
    227     private static void connListenerConfig(ComboPooledDataSource dataSource) {
    228         // 设置连接对象的监听类
    229         dataSource.setConnectionCustomizerClassName("com.rain.Tester.ConnCustomrizerSample");
    230     }
    231 
    232     /**
    233      * 连接对象的事务配置 autoCommitOnClose:是否自动提交事务,true为是,false为否,默认为否 forceIgnoreUnresolvedTransactions
    234      * 回收连接时,是否强制回滚或提交事务,默认为false。一般不设置此值, 例如由Spring来管理事务
    235      * 
    236      * @param dataSource
    237      */
    238     private static void tranConfig(ComboPooledDataSource dataSource) {
    239         // 关闭自动提交事务,默认值为false
    240         dataSource.setAutoCommitOnClose(false);
    241         // 回收连接时,是否强制回滚或提交事务,设置为false。
    242         dataSource.setForceIgnoreUnresolvedTransactions(false);
    243 
    244     }
    245 
    246     /**
    247      * 调试模式的设置 debugUnreturnedConnectionStackTraces:从连接池获取连接对象时,打印所有信息
    248 
    249      * 
    250      * @param dataSource
    251      */
    252     private static void debugMode(ComboPooledDataSource dataSource) {
    253         // 从连接池获取连接对象时,打印所有信息
    254         dataSource.setDebugUnreturnedConnectionStackTraces(true);
    255     }
    256 
    257     /**
    258      * 类加载器的设置。 contextClassLoaderSource:可选值为caller,none,library。默认值为caller,一般不设置此值。
    259      * privilegeSpawnedThreads:
    260      * 
    261      * @param dataSource
    262      */
    263     private static void classLoaderConfig(ComboPooledDataSource dataSource) {
    264         // dataSource.getContext
    265     }
    266 
    267     /**
    268      * 连接池的线程设置 numHelperThread:连接池拥有的线程数量 maxAdministrativeTaskTime:线程执行的超时时间。
    269      * 
    270      * @param dataSource
    271      */
    272     private static void threadConfig(ComboPooledDataSource dataSource) {
    273         // 设置线程数量为10,默认值为3
    274         dataSource.setNumHelperThreads(10);
    275         // 设置线程的超时时间,默认值为0,设置为5分钟
    276         dataSource.setMaxAdministrativeTaskTime(5 * 60);
    277     }
    278 
    279     /**
    280      * 连接池的日志配置,mchange-log.properties提供默认配置
    281      * 
    282      * @param dataSource
    283      */
    284     private static void logConfig(ComboPooledDataSource dataSource) {
    285         // 设置com.mchange.v2.log.MLog
    286         // 设置com.mchange.v2.log.jdk14logging.suppressStackWalk
    287         // 设置com.mchange.v2.log.NameTransformer
    288         // 设置com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL,可选值为
    289         // OFF,SERVER,WARNING,INFO,FINE,FINER,FINEST,ALL
    290     }
    291 
    292     /**
    293      * 其他配置项
    294      * 
    295      * @param dataSource
    296      */
    297     private static void otherConfig(ComboPooledDataSource dataSource) {
    298         // 设置factoryClassLocation
    299         // 设置forceSynchronousCheckins
    300         // statementCacheNumDeferredCloseThreads
    301         // com.mchange.v2.c3p0.cfg.xml
    302         // com.mchange.v2.c3p0.impl.DefaultConnectionTester.querylessTestRunner
    303         // com.mchange.v2.c3p0.impl.DefaultConnectionTester.isValidTimeout
    304     }
    305 
    306     /**
    307      * 打印连接池的属性
    308      * 
    309      * @param dataSource
    310      */
    311     private static void printDataSourceInfo(ComboPooledDataSource dataSource) {
    312         // 连接时的必要属性
    313         System.out.println("——————————————————————————————————————————————————————————————————————");
    314         System.out.println("||-------------------连接数据库的必要属性-----------------||");
    315         System.out.println("数据源的驱动类名称:" + dataSource.getDriverClass());
    316         System.out.println("数据源的连接URL:" + dataSource.getJdbcUrl());
    317         System.out.println("数据源的连接用户名:" + dataSource.getUser());
    318         System.out.println("数据源的连接密码:" + dataSource.getPassword());
    319         System.out.println("数据源的Id:" + dataSource.getIdentityToken());
    320         // 连接池的基本配置
    321         System.out.println("——————————————————————————————————————————————————————————————————————");
    322         System.out.println("||-------------------连接池大小配置---------------------||");
    323         System.out.println("连接池的初始需求量大小:" + dataSource.getInitialPoolSize());
    324         System.out.println("连接池的最大值:" + dataSource.getMaxPoolSize());
    325         System.out.println("连接池的最小值:" + dataSource.getMinPoolSize());
    326         System.out.println("当无可用连接时,连接池需求量的递增值:" + dataSource.getAcquireIncrement());
    327         // 连接对象的生命周期配置
    328         System.out.println("——————————————————————————————————————————————————————————————————————");
    329         System.out.println("||-------------------连接对象的生命周期--------------------||");
    330         System.out.println("连接对象的最大生存时间,从创建连接对象时开始计时:" + dataSource.getMaxConnectionAge());
    331         System.out.println("空闲连接对象的超时时间,从连接对象变为空闲状态开始计时:" + dataSource.getMaxIdleTime());
    332         System.out.println("当连接池负载较低时,空闲连接对象的最大生命年龄:" + dataSource.getMaxIdleTimeExcessConnections());
    333         System.out.println("从连接池获取连接对象之后,连接对象的超时时间:"+dataSource.getUnreturnedConnectionTimeout());
    334         // 测试连接的配置
    335         System.out.println("——————————————————————————————————————————————————————————————————————");
    336         System.out.println("||-------------------测试连接的配置----------------------||");
    337         System.out.println("测试连接使用的数据库表:" + dataSource.getAutomaticTestTable());
    338         System.out.println("测试连接使用的SQL语句:" + dataSource.getPreferredTestQuery());
    339         System.out.println("从连接池中获取连接时是否进行连接测试:"
    340                 + convertBooleanToStr(dataSource.isTestConnectionOnCheckout()));
    341         System.out.println("从连接池中回收连接时是否进行连接测试:"
    342                 + convertBooleanToStr(dataSource.isTestConnectionOnCheckin()));
    343         System.out.println("测试连接的时间间隔:" + dataSource.getIdleConnectionTestPeriod() + "秒");
    344         System.out.println("测试连接使用的类名称:" + dataSource.getConnectionTesterClassName());
    345         // 重连配置
    346         System.out.println("——————————————————————————————————————————————————————————————————————");
    347         System.out.println("||-------------------重连配置-----------------||");
    348         System.out.println("连接失败后,尝试重连的次数:" + dataSource.getAcquireRetryAttempts());
    349         System.out.println("重连的时间间隔:" + dataSource.getAcquireRetryDelay()+"毫秒");
    350         System.out.println("用户等待连接的超时时间:" + dataSource.getCheckoutTimeout());
    351         System.out.println(
    352                 "重连失败后,是否销毁数据源:" + convertBooleanToStr(dataSource.isBreakAfterAcquireFailure()));
    353         // 缓存preparedStatement对象的配置
    354         System.out.println("——————————————————————————————————————————————————————————————————————");
    355         System.out.println("||-------------------缓存preparedStatement对象的配置-----------------||");
    356         System.out.println("连接池拥有PreparedStatement对象的总数:" + dataSource.getMaxStatements());
    357         System.out.println(
    358                 "每个连接拥有PreparedStatement对象的数量:" + dataSource.getMaxStatementsPerConnection());
    359         // 线程设置
    360         System.out.println("——————————————————————————————————————————————————————————————————————");
    361         System.out.println("||-------------------线程设置--------------------------||");
    362         System.out.println("连接池拥有的线程数量:" + dataSource.getNumHelperThreads());
    363         System.out.println(
    364                 "线程执行的超时时间:" + dataSource.getMaxAdministrativeTaskTime());
    365         // 设置事务
    366         System.out.println("——————————————————————————————————————————————————————————————————————");
    367         System.out.println("||-------------------事务配置---------------------------||");
    368         System.out
    369                 .println("连接对象的事务是否自动提交:" + convertBooleanToStr(dataSource.isAutoCommitOnClose()));
    370         System.out.println("回收连接对象时,是否强制提交和回滚事务:"
    371                 + convertBooleanToStr(dataSource.isForceIgnoreUnresolvedTransactions()));
    372         // 设置调试模式
    373         System.out.println("——————————————————————————————————————————————————————————————————————");
    374         System.out.println("||-------------------调试模式配置-----------------------||");
    375         System.out.println("从连接池获取连接对象时,是否打印所有信息:"
    376                 + convertBooleanToStr(dataSource.isDebugUnreturnedConnectionStackTraces()));
    377         // 监听类
    378         System.out.println("——————————————————————————————————————————————————————————————————————");
    379         System.out.println("||-------------------监听类名称-----------------||");
    380         System.out.println("连接对象的监听类名称:" + dataSource.getConnectionCustomizerClassName());
    381 
    382 
    383 
    384 
    385     }
    386 
    387     /**
    388      * 运行测试用例,执行select 1 from dual 语句。
    389      * 
    390      * @param dataSource
    391      * @throws SQLException
    392      */
    393     private static void runSQLTest(ComboPooledDataSource dataSource) throws SQLException {
    394         // 建立连接
    395         Connection conn = dataSource.getConnection();
    396         // 创建Statement对象
    397         Statement statement = conn.createStatement();
    398         // 处理结果集
    399         ResultSet rs = statement.executeQuery("select 1 from dual");
    400         printResultSet(rs);
    401     }
    402 
    403     private static void printResultSet(ResultSet rs) throws SQLException {
    404         while (rs.next()) {
    405             System.out.println("返回结果集为:" + rs.getInt(1));
    406         }
    407     }
    408 
    409     /**
    410      * 连接数据库时的必要配置, driverClass:驱动类 jdbcUrl:数据库实例url,格式为jdbc:subprotocol:subname
    411      * user:用户名,其他数据源有时候使用username表示,拥有相同的含义。 password:密码,用户密码
    412      * 
    413      * @param dataSource
    414      * @return
    415      * @throws PropertyVetoException
    416      */
    417     public static ComboPooledDataSource connDatabaseConfig(ComboPooledDataSource dataSource,
    418             String dsName) throws PropertyVetoException {
    419         String jdbcUrl = null;
    420         switch (dsName) {
    421             case "masterOracle":
    422                 jdbcUrl = masterOraclejdbcUrl;
    423                 break;
    424             case "orcl":
    425                 jdbcUrl = orclJdbcUrl;
    426                 break;
    427             default:
    428                 break;
    429         }
    430         // 设置数据库url
    431         dataSource.setJdbcUrl(jdbcUrl);
    432         // 设置数据库驱动类
    433         dataSource.setDriverClass(driverClassName);
    434         // 设置用户名
    435         dataSource.setUser(user);
    436         // 设置密码
    437         dataSource.setPassword(password);
    438         // 输出dataSourceName,在初始化ComboPooledDataSource时,字符串参数作为数据源名称,
    439         dataSource.getDataSourceName();
    440         return dataSource;
    441     }
    442 
    443     /**
    444      * 将布尔值true转换为是,布尔值false转换为否
    445      * 
    446      * @param value
    447      * @return
    448      */
    449     private static String convertBooleanToStr(boolean value) {
    450         if (value) {
    451             return "是";
    452         } else {
    453             return "否";
    454         }
    455     }
    456 }
    View Code

    Properties方式:在类加载路径下,配置项有c3p0前缀

    ##-------------------------------数据库连接属性-----------------------------------##
    # 驱动类名称
    c3p0.driverClass=oracle.jdbc.driver.OracleDriver
    # 数据库实例url地址
    c3p0.jdbcUrl=jdbc:oracle:thin:@localhost:1521:masteroracle
    # 用户名
    c3p0.user=system
    # 密码
    c3p0.password=password
    ##-------------------------------调试模式--------------------------------------##
    # 当从连接池获取连接对象时,打印所有信息。
    c3p0.debugUnreturnedConnectionStackTraces=true
    ##-------------------------------日志配置--------------------------------------##
    # 日志的实现方式
    #com.mchange.v2.log.MLog=log4j
    # 日志的级别,OFF,SERVER,WARNING,INFO,FINE,FINER,FINEST,ALL
    com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=All
    # 日志按包输出
    com.mchange.v2.log.NameTransformer=com.mchange.v2.log.PackageNames
    # determine the class and method from which a log message was generated,当为true时,不打印这些日志信息
    com.mchange.v2.log.jdk14logging.suppressStackWalk=true
    ##-------------------------------连接池配置-------------------------------------##
    # 连接池拥有连接对象的初始值,这种情形下只是Acquire(需求)的初始值,真正创建对象会根据Acquire来按需创建
    c3p0.initialPoolSize=10
    # 连接池拥有连接对象的最大值,默认值为3
    c3p0.maxPoolSize=20
    # 连接池拥有连接对象的最小值,默认值为3
    c3p0.minPoolSize=5
    # 当无空闲连接时,新创建的连接数,默认值为3
    c3p0.acquireIncrement=3
    ##-------------------------------连接生命周期--------------------------##
    # 连接对象的最大生存时间,起始时间从连接池从数据库中创建连接对象开始计算。0表示永远不销毁
    c3p0.maxConnectionAge=0
    # 空闲连接对象的超时时间,起始时间从连接对象状态变为空闲时起计算。
    c3p0.maxIdleTime=1800
    # 当连接池不处于满载状态时,空闲连接对象的最大生存时间,设置此值,可以快速的减少连接池的大小
    c3p0.maxIdleTimeExcessConnections=60
    # 连接对象回收的超时时间,当连接池无法在一定时间内回收连接对象时,销毁旧对象,重新创建新对象
    c3p0.unreturnedConnectionTimeout=600
    ##-------------------------------测试连接配置项----------------------------------##
    # 从连接池中获取连接对象时进行连接测试
    c3p0.testConnectionOnCheckout=true
    # 从连接池回收对象时进行连接测试
    c3p0.testConnectionOnCheckin=true
    # 连接测试的间隔,在这一段时间内不进行连接测试
    c3p0.idleConnectionTestPeriod=60
    # 连接测试时使用的类,设置此值时忽略preferredTestQuery,automaticTestTable等属性值
    #c3p0.connectionTesterClassName=com.rain.Tester.ConnectionTesterSample
    # 测试的SQL语句
    c3p0.preferredTestQuery=select 1
    # 连接测试时使用的数据库表
    c3p0.automaticTestTable=test
    ##-------------------------------重新连接---------------------------------------##
    # 重新连接的次数
    c3p0.acquireRetryAttempts=5
    # 重新连接的时间间隔,单位为毫秒
    c3p0.acquireRetryDelay=3000
    # 等待连接响应的超时时间
    c3p0.checkoutTimeout=120
    # 当连接失败时,是否销毁数据源对象,true表示是,false表示否
    c3p0.breakAfterAcquireFailure=true
    ##-------------------------------statement对象相关配置---------------------------##
    # c3p0拥有的PreparedStatement对象的总数
    c3p0.maxStatements=100
    # 每个连接拥有PreparedStament对象的数量
    c3p0.maxStatementsPerConnection=10
    # 当Connection对象关闭时,启动额外线程确保statement对象关闭
    # This parameter should only be set if you observe that attempts by c3p0 to close() cached statements freeze
    statementCacheNumDeferredCloseThreads=1
    ##-------------------------------线程池----------------------------------------##
    # 连接池拥有的线程数量
    c3p0.numHelperThreads=5
    # 线程执行的最大时间
    c3p0.maxAdministrativeTaskTime=600
    # 启动独立的线程来在连接被连接池回收阶段进行测试
    forceSynchronousCheckins=true
    ##-------------------------------事务-----------------------------------------##
    # 交给Spring去管理事务,默认不配置这些项
    # 连接关闭时,是否自动提交事务
    c3p0.autoCommitOnClose=false
    # 连接回收时,是否强制提交或者回滚当前连接拥有的事务,默认不配置。
    c3p0.forceIgnoreUnresolvedTransactions=false
    ##-------------------------------监听类---------------------------------------##
    c3p0.connectionCustomizerClassName=com.rain.Tester.ConnCustomrizerSample
    ##-------------------------------类加载器配置------------------------------------##
    # contextClassLoaderSource should be set to one of caller, library, or none
    c3p0.contextClassLoaderSource=caller
    # privilegeSpawnedThreads is a boolean, false by default. Set this to true so that c3p0's Threads use the
    # c3p0 library's AccessControlContext, rather than an AccessControlContext that may be associated with 
    # the client application and prevent its garbage collection.
    privilegeSpawnedThreads=false
    View Code

    xml方式:com.mchange.v2.c3p0.cfg.xml指定c3p0-config.xml的路径

    System属性:System.setProperty(key,value)。

    验证                                                                    

    代码方式的执行结果

    ——————————————————————————————————————————————————————————————————————
    ||-------------------连接数据库的必要属性-----------------||
    数据源的驱动类名称:oracle.jdbc.driver.OracleDriver
    数据源的连接URL:jdbc:oracle:thin:@localhost:1521:masteroracle
    数据源的连接用户名:system
    数据源的连接密码:password
    数据源的Id:1hge1639oxiibou10417lr|7506e922
    ——————————————————————————————————————————————————————————————————————
    ||-------------------连接池大小配置---------------------||
    连接池的初始需求量大小:10
    连接池的最大值:20
    连接池的最小值:5
    当无可用连接时,连接池需求量的递增值:3
    ——————————————————————————————————————————————————————————————————————
    ||-------------------连接对象的生命周期--------------------||
    连接对象的最大生存时间,从创建连接对象时开始计时:0
    空闲连接对象的超时时间,从连接对象变为空闲状态开始计时:1800
    当连接池负载较低时,空闲连接对象的最大生命年龄:60
    从连接池获取连接对象之后,连接对象的超时时间:600
    ——————————————————————————————————————————————————————————————————————
    ||-------------------测试连接的配置----------------------||
    测试连接使用的数据库表:test
    测试连接使用的SQL语句:select 1
    从连接池中获取连接时是否进行连接测试:是
    从连接池中回收连接时是否进行连接测试:是
    测试连接的时间间隔:60秒
    测试连接使用的类名称:com.mchange.v2.c3p0.impl.DefaultConnectionTester
    ——————————————————————————————————————————————————————————————————————
    ||-------------------重连配置-----------------||
    连接失败后,尝试重连的次数:5
    重连的时间间隔:3000毫秒
    用户等待连接的超时时间:120
    重连失败后,是否销毁数据源:是
    ——————————————————————————————————————————————————————————————————————
    ||-------------------缓存preparedStatement对象的配置-----------------||
    连接池拥有PreparedStatement对象的总数:100
    每个连接拥有PreparedStatement对象的数量:10
    ——————————————————————————————————————————————————————————————————————
    ||-------------------线程设置--------------------------||
    连接池拥有的线程数量:5
    线程执行的超时时间:600
    ——————————————————————————————————————————————————————————————————————
    ||-------------------事务配置---------------------------||
    连接对象的事务是否自动提交:否
    回收连接对象时,是否强制提交和回滚事务:否
    ——————————————————————————————————————————————————————————————————————
    ||-------------------调试模式配置-----------------------||
    从连接池获取连接对象时,是否打印所有信息:是
    ——————————————————————————————————————————————————————————————————————
    ||-------------------监听类名称-----------------||
    连接对象的监听类名称:com.rain.Tester.ConnCustomrizerSample

    参考资料                                              

    C3p0 —— JDBC 3 Connection and Statement Pooling   http://www.mchange.com/projects/c3p0

  • 相关阅读:
    数组小练习
    数组
    利用数组进行排序
    继承练习
    黄金分割点
    百万富翁-循环练习
    SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的区别及应用——c#
    进制转换以及与字符串之间转换——c#
    文件中的类都不能进行设计,因此未能为该文件显示设计器
    winfrom自绘窗体边框——c#
  • 原文地址:https://www.cnblogs.com/rain144576/p/6947544.html
Copyright © 2020-2023  润新知