c3p0数据库连接池的使用

据说c3p0数据库连接池是最优秀的,当然这也是我道听途说的,没有实际证实过。今天我抽空写了一个c3p0的例子,借此也总结一下。

一、jar包
mysql-connector-java-5.1.39-bin.jar
c3p0.jar

二、配置文件

作为一个数据库连接池自然有很多参数要设置,当然就算你不设置也有默认的,不过那不一定能满足你的要求。这里的配置文件没有什么特别的要求,可以是xml也可以是properties甚至与txt都行,当然如果你愿意也可以写死在程序中。

下面是我的配置文件,我把它放在了根目录下,名字叫“c3p0.properties”

#jdbc基本信息  
driverClass = com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/c3p0?useUnicode=true&characterEncoding=utf-8 
user = root
password = 123456

#c3p0连接池信息  
c3p0.minPoolSize = 3
c3p0.maxPoolSize = 25

#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数  
c3p0.acquireIncrement=3
#定义在从数据库获取新连接失败后重复尝试的次数  
c3p0.acquireRetryAttempts = 60  
#两次连接中间隔时间,单位毫秒  
c3p0.acquireRetryDelay = 1000
#连接关闭时默认将所有未提交的操作回滚  
c3p0.autoCommitOnClose = false 
#当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒  
c3p0.checkoutTimeout = 3000  
#每120秒检查所有连接池中的空闲连接。Default: 0  
c3p0.idleConnectionTestPeriod = 120  
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0  
c3p0.maxIdleTime = 600
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false  
c3p0.testConnectionOnCheckin=true  
#c3p0将建一张名为c3p0TestTable的空表,并使用其自带的查询语句进行测试。  
jdbc.automaticTestTable = c3p0TestTable  

三、代码实现

c3p0的使用非常简单,基本上就是三步搞定。

DataSource unPooled = DataSources.unpooledDataSource(url,jdbcproperties);//这里的第二个参数放的是连接数据库的信息,包括user、password等信息
DataSource ds = DataSources.pooledDataSource(unPooled,c3propertis);//这里面的第二个参数放的是c3p0连接池的配置信息
Connection conn = ds.getConnection();
这三句代码相信大家很容易看明白,也是使用c3p0连接池的核心代码,真的很简单。

package c3p0;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.DataSources;

public class C3P0ConnentionProvider {
    private static final String JDBC_DRIVER = "driverClass";  
    private static final String JDBC_URL = "jdbcUrl";  

    private static DataSource ds;

    static{
        initDBSource();
    }

    private static void initDBSource(){
        Properties c3p0Pro = new Properties();
        try {
            c3p0Pro.load(new FileInputStream("c3p0.properties"));
            System.out.println("加载配置文件完成。。。");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String driverClass = c3p0Pro.getProperty(JDBC_DRIVER);
        String jdbcUrl = c3p0Pro.getProperty(JDBC_URL);
        if(driverClass!=null){
            try {
                //加载驱动文件
                Class.forName(driverClass);
                System.out.println("加载驱动文件完成....");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }


         Properties c3propes = new Properties(); 
         Properties jdbcpropes = new Properties(); 
         for(Object key:  c3p0Pro.keySet()){
             String skey = (String)key;  
             if(skey.startsWith("c3p0.")){
                 c3propes.put(skey, c3p0Pro.getProperty(skey));
             }else {
                jdbcpropes.put(skey, c3p0Pro.getProperty(skey));
            }
         }

         try {
             //建立连接池
            DataSource dataSource = DataSources.unpooledDataSource(jdbcUrl,jdbcpropes);
            ds = DataSources.pooledDataSource(dataSource, c3propes);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static synchronized Connection getConnection() throws SQLException{  
        final Connection conn = ds.getConnection();  
        conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  
        return conn;  
    } 
}

测试类:

package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import c3p0.C3P0ConnentionProvider;

public class TestC3p0 {
    public static void main(String[] args) {
        for(int i=0;i<30;i++){
            new Thread(new C3P0()).start();
        }
    }
}

class C3P0 implements Runnable{

    @Override
    public void run() {
        try {
            Connection connection = C3P0ConnentionProvider.getConnection();
            PreparedStatement statement = connection.prepareStatement("select * from students where id = '1' ");
            ResultSet resultSet = statement.executeQuery();
            resultSet.next();
            System.out.println(Thread.currentThread().getName()+":"+resultSet.getString("name")); 

            try {
                Thread.sleep(10*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

原文链接http://blog.csdn.net/wushangjimo/article/details/12654491

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值