连接池

 
开源数据库连接池
现在很多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

  

 

 

 

 

 

 

posted @ 2013-04-07 19:23  hacket520  阅读(411)  评论(0)    收藏  举报