C3P0由三部分内容组成。实例化对象,各配置项的含义,以及加载配置项的方式。
实例化对象的方式有三种,第一种方式直接new ComboPooledDataSource,第二种方式使用工厂类DataSources.poolDataSource方法。第三种不常见。第一种方式是最方便的方式。
C3P0的配置项主要有:
- 连接数据库的必要属性:例如jdbcUrl,user,password等。
- 连接池的大小配置。例如initialPoolSize
- 连接对象的生命周期。例如maxConnectionAge。
- 测试连接的配置,例如preferredTestQuery指定测试SQL语句。
- 重连策略的配置,例如acquireRetryAttempts指定重连次数。
- statement对象的配置,例如maxStatements指定最大Statement的总数。
- 线程配置,例如numHelperThread指定连接池拥有的线程数量。
- 事务配置,例如autoCommitOnClose指定是否在回收连接对象时自动提交事务。
- 调试模式,例如debugUnreturnedConnectionStackTraces为true时,会打印所有从连接池获取连接对象的记录。
- 监听类的设置,例如connectionCustomizerClassName指定监听类的名称,该类可以实现onAcquire,onDestory等方法。
- 日志的设置,例如com.mchange.v2.log.MLog指定日志的实现方式。常见的有log4J,commonLogging等。
配置项常见的加载方式有三种:
- 代码方式:通过实例对象调用setXX方法。
- properties文件:这种方式需要properties文件的名称必须为c3p0.properties,而且该文件必须在类加载路径下。
- 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 }
连接必要属性
- driverClassName:驱动类的名称,包名+类名
- jdbcUrl:数据库实例的url地址,格式为jdbc:subprotocol:subname。其中subprotocol表示连接方式。
- user:用户名
- 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();