连接池
开源数据库连接池
现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
•DBCP 数据库连接池(tomcat)
•C3P0 数据库连接池(hibernate)
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。
DBCP数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下Jar 文件:
•commons-dbcp.jar:连接池的实现
•commons-pool.jar: 连接池实现的依赖类
•commons-collections.jar :连接池实现的集合类
Tomcat 的连接池正是采用该连接池来实现的。
1)传统方式找DriverManager要连接,数目是有限的。
2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行
3)项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式。
4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
*6)C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时会自动在指定的目录下找xml文件,并加载默认设置
传统方式和DBCP比较:
传统方式:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class PoolDemo {
// 传统方式获取Connection
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = null;
long start = System.currentTimeMillis();
for(int i=0;i<10000;i++){
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb2?user=root&password=123456";
if(conn!=null){
conn = DriverManager.getConnection(url);
conn.close();
System.out.println("conn : "+i+" "+conn);
}
}
long end =System.currentTimeMillis();
System.out.println("总共耗时:"+(end-start));
// 总共耗时:55114ms
}
}
DBCP方式:
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DbcpDemo {
//测试连接池DBCP的用法
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
Connection conn = null;
// 通过类加载器加载文件-//加载属性文件
InputStream is = DbcpDemo.class.getClassLoader().getResourceAsStream("cn/zengfansheng/pool/dbcp/dbcp.properties");
Properties properties = new Properties();
properties.load(is);
//创建DBCP连接池工厂
// BasicDataSourceFactory bdsf = new BasicDataSourceFactory();
//创建数据源,即连接池
DataSource ds = BasicDataSourceFactory.createDataSource(properties);
for(int i=0;i<100000;i++){
//从连接池中取得一个空闲的连接对象
conn = ds.getConnection();
if(conn!=null){
System.out.println("conn : "+i+" "+conn);
}
//将连接对象还回给连接池
conn.close();//归还连接到连接池
}
long end =System.currentTimeMillis();
System.out.println("总共耗时:"+(end-start)/1000+"秒");//10W个连接,总共耗时:12秒
}
}
dbcp.propertes文件内容:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mydb2 username=root password=123456
by hacket

浙公网安备 33010602011771号