数据库连接池的三种模式

数据库连接池的三种方式
(1) DBCP连接池(参数详解http://www.ask3.cn/a/jingcaibowen/shujuku/mysql/2011/1025/25419.html)
DBCP连接池是Apache软件基金组织下的一个开源连接池实现。
需要: commons-dbcp-1.2.1.jar //连接池的实现
commons-pool.jar //连接池实现的倚赖库
commons-collection.jar //连接池实现的倚赖库


代码:

package wyd.spring.datasource.dbcp;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class DBCPDataSource {
private static BasicDataSource dataSource=null;
private static final String driver="com.mysql.jdbc.Driver";
private static final String url="jdbc:mysql://localhost:3306/wyd";
private static final String userName="root";
private static final String password="root";

public static DataSource getDataSource(){
if(dataSource==null){
dataSource=new BasicDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);
}

return dataSource;
}

public static Connection getConnection() throws SQLException{

return DBCPDataSource.getDataSource().getConnection();
}

}


(2) C3PO 连接池具体参数参考网址(http://zdq0426.blog.163.com/blog/static/221690942010123105810188/)
C3PO 连接池是一个优秀的连接池,推荐使用。C3PO实现了JDBC3.0规范的部分功能,因而性能更加突出。
需要的jar包: c3po0.902.jar

代码:
package wyd.spring.datasource.c3po;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;


import wyd.spring.datasource.dbcp.DBCPDataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3PODataSource {
private static ComboPooledDataSource dataSource=null;
private static final String driver="com.mysql.jdbc.Driver";
private static final String url="jdbc:mysql://localhost:3306/wyd";
private static final String userName="root";
private static final String password="root";

public static DataSource getDataSource(){
if(dataSource==null){
dataSource=new ComboPooledDataSource();
try {
dataSource.setDriverClass(driver);
} catch (PropertyVetoException e) {
System.out.println("DataSource Load Driver Exception!!");
e.printStackTrace();
}
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
//设置连接池最大连接容量
dataSource.setMaxPoolSize(20);
//设置连接池最小连接容量
dataSource.setMinPoolSize(2);
//设置连接池最大statements对象容量
dataSource.setMaxStatements(100);

}

return dataSource;
}


public static Connection getConnection() throws SQLException{

return DBCPDataSource.getDataSource().getConnection();
}
}

(3)bonecp连接池(参数详解:http://www.blogjava.net/sxyx2008/archive/2011/03/16/346386.html)
public static BoneCP getConnectionPool(){
if (connectionPool == null) {
try {
Class.forName(driver);
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl(url); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
config.setUsername(userName);
config.setPassword(password);
//数据库连接池的最小连接数 
config.setMinConnectionsPerPartition(5); 
//数据库连接池的最大连接数 
config.setMaxConnectionsPerPartition(10); 
// 
config.setPartitionCount(1); 
//设置数据库连接池 
connectionPool = new BoneCP(config); 
           
} catch (Exception e) {
e.printStackTrace();
}
}
return connectionPool;
}

高度可扩展, 快速的连接池.   
注:1)不用synchronized 关键字来处理多线程对资源的争用,而是使用 java.util.concurrent 包中的锁机制;
2)首次使用分区机制来分开管理数据库连接;或许还有其他原因。
Callback (hook interceptor) mechanisms on a change of connection state.
利用分区技术提高性能>
允许直接访问一个连接或者语句
智能调整连接池大小
SQL语句缓存支持
支持异步获取数据库连接 (通过返回Future<Connection>的形式
通过释放连接助理进程来释放数据库连接,提高性能.
通过initSQL参数在每次获取连接的时候执行SQL
支持数据库热切换
自动重试失败的数据库操作(当数据库或者网络挂掉的时候)
JMX support
延迟初始化能力(Lazy initialization capable)
自动检测连接可用性 (keep-alives 等)

自我测试结果:
测试环境:2G内存,160G硬盘,
方式:循环打开关闭10000次
dbpc:平均2280ms
c3po:平均2250ms
bencp:平均870ms

附件为三个示例