C3P0连接池
- C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
彻底死掉的C3P0
- 在很长一段时间内,它一直是Java领域内数据库连接池的代名词,当年盛极一时的Hibernate都将其作为内置的数据库连接池,可以业内对它的稳定性还是认可的。C3P0功能简单易用,稳定性好这是它的优点,但是
性能上的缺点
却让它彻底被打入冷宫。C3P0的性能很差,差到即便是同时代的产品相比它也是垫底的,更不用和Druid、HikariCP等相比了。正常来讲,有问题很正常,改就是了,但c3p0最致命的问题就是架构设计过于复杂,让重构变成了一项不可能完成的任务。随着国内互联网大潮的涌起,性能有硬伤的c3p0彻底的退出了历史舞台。
C3P0与DBCP区别
- (1)dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
- (2)dbcp需要手动加载配置文件
- c3p0自动加载
C3P0使用步骤
导入jar包
- (1)c3p0-0.9.1.2.jar
- (2)mchange-commons-java-0.2.11.jar
- (3)mysql驱动包
添加配置文件
- C3P0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
- 文件位置: /src/resource
- 文件命名:c3p0-config.xml/c3p0.properties
- c3p0-Config.xml代码示例:
<c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <!-- 基本配置 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/school</property> <property name="user">root</property> <property name="password">root</property> <!--扩展配置--> <!-- 连接超过10秒报错--> <property name="checkoutTimeout">10000</property> <!--30秒检查空闲连接 --> <property name="idleConnectionTestPeriod">30</property> <!-- 初始大小 --> <property name="initialPoolSize">10</property> <!-- 每次增长的个数 --> <property name="acquireIncrement">5</property> <!-- 30秒不适用丢弃--> <property name="maxIdleTime">30</property> <property name="maxPoolSize">50</property> <property name="minPoolSize">5</property> </default-config> <!-- 命名的配置 --> <named-config name="bj1805"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day2</property> <property name="user">root</property> <property name="password">111</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <property name="initialPoolSize">20</property> <property name="minPoolSize">10</property> <property name="maxPoolSize">40</property> </named-config> </c3p0-config>
- c3p0.properties代码示例(推荐使用):
#配置信息 c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://localhost:3306/myschool?useSSL=true c3p0.user=root c3p0.password=root #设置增长的大小 c3p0.acquireIncrement=5 #初始大小 c3p0.initialPoolSize=20 #最小池大小 c3p0.minPoolSize=10 #最大池大小 c3p0.maxPoolSize=40 #超时时间 c3p0.checkoutTimeout=5000
- 注意:
- c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
- 如果xml配置文件和属性文件都存在时,xml优先级高于属性文件
- 代码示例:
public class C3P0Util { private static ComboPooledDataSource cpds; static { try { //自动去获取配置信息,配置文件名字必须是c3p0.properties cpds = new ComboPooledDataSource(); //硬编码,不建议使用,上面一条语句,加上配置文件即可 //四个基本属性 // dataSource.setDriverClass("com.mysql.jdbc.Driver"); // dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8"); // dataSource.setUser("root"); // dataSource.setPassword("root"); // // //其他属性 // //1初始大小 // dataSource.setInitialPoolSize(20); // //2最大大小 // dataSource.setMaxPoolSize(50); // //3最小池大小 // dataSource.setMinPoolSize(10); // //4设置增长的大小 // dataSource.setAcquireIncrement(5); // //5超时时间 // dataSource.setCheckoutTimeout(5000); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return cpds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } }