c3p0配置详解

数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理。

一、实现方式:

C3P0有三种方式实现:

1.自己动手写代码,实现数据源

例如:在类路径下配置一个属性文件,config.properties,内容如下:

driverClass=xxx

jdbcUrl=xxx

user=xxx

password=xxx

...

然后代码中实现

Properties props = new Properties();

InputStream in = Thread.class.getResourceAsStream("config.properties");

props.load(in);

in.close();

ComboPooledDataSource cpds = new ComboPooledDataSource();

cpds.setDriverClass(props.getProperty("driverClass"));

cpds.setJdbcUrl(props.getProperty("jdbcUrl"));

cpds.setUser(props.getProperty("user"));

cpds.setPassword(props.getProperty("password"));

...

这里实现了一个数据源。

也可以这样配置,在类路径下配置一个xml文件,config.xml

<config>

<source name="source1">

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

<property name="password">xxx</property>

<property name="url">xxx</property>

<property name="driverClass">xxx</property>

</source>

<source name="source2">

...

</source>

</config>

然后自己解析xml文件,这样可以实现多个数据源的配置

2.配置默认的熟悉文件

类路径下提供一个c3p0.properties文件(不能改名)

配置如下:

c3p0.driverClass=com.mysql.jdbc.Driver

c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc

c3p0.user=root

c3p0.password=java

...

上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:

...

DataSource  ds = new ComboPooledDataSource();

return ds;

...

然后就可以使用数据源了,C3P0会对c3p0.properties进行自动解析的

3.路径下提供一个c3p0-config.xml文件

这种方式使用方式与第二种差不多,但是有更多的优点 
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式

<c3p0-config>

<default-config>

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

<property name="password">java</property>

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

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

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

<property name="maxIdleTime">30</property>

<property name="maxPoolSize">100</property>

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

</default-config>

<named-config name="mySource">

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

<property name="password">java</property>

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

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

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

<property name="maxIdleTime">30</property>

<property name="maxPoolSize">100</property>

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

</named-config>

</c3p0-config>

...

DataSource  ds = new ComboPooledDataSource("mySource");

return ds;

...

这样就可以使用数据源了。

二、部分参数配置说明:

1.最常用配置

initialPoolSize:连接池初始化时创建的连接数,default : 3(建议使用)

minPoolSize:连接池保持的最小连接数,default : 3(建议使用)

maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)

acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)

2.管理连接池的大小和连接的生存时间

maxConnectionAge:配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)

maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)

maxIdleTimeExcessConnections:这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导
致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配
置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)

3.配置连接测试:

automaticTestTable:配置一个表名,连接池根据这个表名用自己的测试sql语句在这个空表上测试数据库连接,这个表只能由c3p0来使用,用户不能操作。default : null(不建议使用)

preferredTestQuery:与上面的automaticTestTable二者只能选一。自己实现一条SQL检测语句。default : null(建议使用)

idleConnectionTestPeriod:用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时
断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无
会话的状态打破。为0则不测试。default : 0(建议使用)

testConnectionOnCheckin:如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)

testConnectionOnCheckout:性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)

4.配置PreparedStatement缓存:

maxStatements:连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个
Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。同时
maxStatementsPerConnection的配置无效。default : 0(不建议使用)

maxStatementsPerConnection:连接池为数据源单个Connection缓存的PreparedStatement数,这
个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。
default : 0(看情况而论)

5.重连相关配置

acquireRetryAttempts:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)

acquireRetryDelay:连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)

breakAfterAcquireFailure:如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。default : false(不建议使用)

checkoutTimeout:配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放或
者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException。其实就是
acquireRetryAttempts*acquireRetryDelay。default : 0(与上面两个,有重复,选择其中两个都行)

6.定制管理Connection的生命周期

connectionCustomizerClassName:用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在Connection丢弃的时候进行资源关闭,

就可以通过继承一个AbstractConnectionCustomizer来实现相关方法,配置的时候使用全类名。有点类似监听器的作用。default : null(不建议使用)

7.配置未提交的事务处理

autoCommitOnClose:连接池在回收数据库连接时是否自动提交事务。如果为false,则会回滚未提交的事务,如果为true,则会自动提交事务。default : false(不建议使用)

forceIgnoreUnresolvedTransactions:这个配置强烈不建议为true。default : false(不建议使用)

一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?

8.配置debug和回收Connection

unreturnedConnectionTimeout:为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在
设定的时间到达后回收Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭情况的
不是很适用。建议手动关闭。default : 0 单位 s(不建议使用)

debugUnreturnedConnectionStackTraces:如果为true并且
unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接
unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为打印堆栈信息会减慢
getConnection的速度default : false(不建议使用)

其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来。

三、示例:

示例采用第二种方式:

1.c3p0.properties:

Java代码  

  1. #驱动
  2. c3p0.driverClass=com.mysql.jdbc.Driver
  3. #地址
  4. c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
  5. #用户名
  6. c3p0.user=root
  7. #密码
  8. c3p0.password=lovejava
  9. #-------------------------------
  10. #连接池初始化时创建的连接数
  11. c3p0.initialPoolSize=3
  12. #连接池保持的最小连接数
  13. c3p0.minPoolSize=3
  14. #连接池在无空闲连接可用时一次性创建的新数据库连接数,default:3
  15. c3p0.acquireIncrement=3
  16. #连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
  17. c3p0.maxPoolSize=15
  18. #连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒
  19. c3p0.maxIdleTime=100
  20. #连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
  21. c3p0.acquireRetryAttempts=30
  22. #连接池在获得新连接时的间隔时间
  23. c3p0.acquireRetryDelay=1000

2.ConnectionPool

Java代码  

  1. package com.study.pool;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import javax.sql.DataSource;
  5. import com.mchange.v2.c3p0.ComboPooledDataSource;
  6. public class ConnectionPool {
  7. private DataSource ds;
  8. private static ConnectionPool pool;
  9. private ConnectionPool(){
  10. ds = new ComboPooledDataSource();
  11. }
  12. public static final ConnectionPool getInstance(){
  13. if(pool==null){
  14. try{
  15. pool = new ConnectionPool();
  16. }catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. return pool;
  21. }
  22. public synchronized final Connection getConnection() {
  23. try {
  24. return ds.getConnection();
  25. } catch (SQLException e) {
  26. e.printStackTrace();
  27. }
  28. return null;
  29. }
  30. }

3.PoolThread

Java代码  

  1. package com.study.pool;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. public class PoolThread extends Thread {
  7. @Override
  8. public void run(){
  9. ConnectionPool pool = ConnectionPool.getInstance();
  10. Connection con = null;
  11. PreparedStatement stmt= null;
  12. ResultSet rs = null;
  13. try{
  14. con = pool.getConnection();
  15. stmt = con.prepareStatement("select sysdate as nowtime from dual");
  16. rs = stmt.executeQuery();
  17. while(rs.next()){
  18. System.out.println(Thread.currentThread().getId()+"---------------开始"+rs.getString("nowtime"));
  19. }
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }finally{
  23. try {
  24. rs.close();
  25. stmt.close();
  26. con.close();
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. System.out.println(Thread.currentThread().getId()+"--------结束");
  32. }
  33. }

4.PoolMain

Java代码  

    1. package com.study.pool;
    2. public class PoolMain {
    3. /**
    4. * 数据源缓冲池 实例练习
    5. */
    6. public static void main(String[] args) {
    7. System.out.println("缓冲池模拟开始");
    8. PoolThread[] threads = new PoolThread[50];
    9. for(int i=0;i<threads.length;i++){
    10. threads[i] = new PoolThread();
    11. }
    12. for(int i=0;i<threads.length;i++){
    13. threads[i].start();
    14. }
    15. }
    16. }
时间: 2024-10-12 12:58:46

c3p0配置详解的相关文章

Spring之——c3p0配置详解

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51162560 今天,我们就来详细谈谈Spring中的c3p0配置问题,好了,不耽搁大家的时间,我们直接进入主题,请看下面的具体配置文件信息: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/

数据层spring-dao.xml配置文件中C3P0连接池配置详解

数据层spring-dao.xml配置文件中C3P0连接池配置详解 先放上两种配置文件bean的相关代码,文章下面会有详细的配置属性的讲解,大家可以自己添加配置和修改配置普通单一数据库连接池配置: <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 配置连接池属性 --> <property name="driverClas

c3p0xml配置详解

<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败后重复尝

使用LVS实现负载均衡原理及安装配置详解

转:http://www.cnblogs.com/liwei0526vip/p/6370103.html 使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学习 LVS 并对其进行了详细的总结记录. 一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director

LVS配置详解

一.LVS系统组成 前端:负载均衡层 –      由一台或多台负载调度器构成 中间:服务器群组层 –      由一组实际运行应用服务的服务器组成 底端:数据共享存储层 –      提供共享存储空间的存储区域 二.LVS术语 Director Server:调度服务器,将负载分发到RealServer的服务器 Real Server:真实服务器,真正提供应用服务的服务器 VIP:虚拟IP地址,公布给用户访问的IP地址 RIP:真实IP地址,集群节点上使用的IP地址 DIP:Director连

logback logback.xml 常用配置详解

一:根节点 包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效.默认的时间间隔为1分钟. debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态.默认值为false. 例如: <configuration scan="true" scan

php-fpm的配置详解

php5.3自带php-fpm /usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的/var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log错误日志,默认在安装目录中的/var/log/php-fpm.log log_level = notice错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notic

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

Windows下Nginx Virtual Host多站点配置详解

Windows下Nginx Virtual Host多站点配置详解 此教程适用于Windows系统已经配置好Nginx+Php+Mysql环境的同学. 如果您还未搭建WNMP环境,请查看 windows7配置Nginx+php+mysql教程. 先说明一下配置多站点的目的:在生产环境中,如果将系统所有代码文件都放在公开目录中,则很容易被查看到系统源码,这样是很不安全的,所以需要只公开index.php的入口文件目录.而同一个服务器中,可能运行多个系统,这样就必须公开多个入口文件目录,以便用不同的