据说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