连接池c3p0和DBCP

发表时间:2017-05-11 16:54:03 浏览量( 20 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、连接池简介

为什么我们需要连接池呢?因为在程序运行时,我们经常需要访问数据库,而每一次对数据库的访问或者操作,都需要经历几个固定的步骤:建立数据库连接、存取数据和关闭数据库连接等。在这几个步骤中,建立数据库连接是其中最为耗时的,所需资源最到,对手数据库压力也大,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法, 

连接池是创建和管理一个连接缓冲池的技术,JDBC连接的时候需要调用DriverManager.getConnection() ,采用连接池技术,可以取得已经保存在连接池的连接对象,这样就不用每一次都建立连接了。

数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接对象了。连接池唯一的一个缺点就是初始化时由于需要建立连接数据库对象,所以启动时间就慢了,但是运行效率将会大大提高。连接池示意图:


连接池从上面的讲解中虽然不难实现,但是如果真的要自己实现,还是很费时的,网上已经有很多实现了连接池的开源技术了,这里讲解两个:C3P0和DBCP两个开源技术。

二、C3P0的实现

当然我们需要先导入C3p0Util的开源包:c3p0-0.9.1.2.jar。新建一个C3p0Util类。从上图可知,连接池就应该只有一个,所以我们需要定位这个类为单例,具体实现代码如下:

public class C3p0Util {

	private String driver = "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://192.168.11.144/first?useUnicode=true&characterEncoding=utf8";
	private String dbusername = "root";
	private String dbpass = "123456";

	private static C3p0Util c3p0Util;
	
	//连接池对象
	private ComboPooledDataSource cpds;

	private C3p0Util() {
		cpds=new ComboPooledDataSource();
		
		try {
			cpds.setDriverClass(driver);
			cpds.setJdbcUrl(url);
			cpds.setUser(dbusername);
			cpds.setPassword(dbpass);
			
			//连接池基本属性
			
			//初始化的连接池的数量
			cpds.setInitialPoolSize(5);
			//支持的最大连接
			cpds.setMaxPoolSize(15);
			//保持最小连接数
			cpds.setMinPoolSize(3);
			//最大超时时间
			cpds.setMaxIdleTime(3);
			
			
		} catch (PropertyVetoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

	public static C3p0Util getInstance() {
		if (c3p0Util == null) {
			c3p0Util = new C3p0Util();
		}
		return c3p0Util;
	}
	
	//提供一个获得连接的方法
	public Connection getCon() throws SQLException{
		return cpds.getConnection();
	}
}

修改BaseDao获得连接的方法即可,其他的代码都不需要改了。你可以测试一下添加一个用户。

三、DBCP的实现

也是一样先导入DBCP的开源包,它需要三个包:commons-collections.jar、commons-dbcp.jar、commons-pool.jar。新建一个类DbcpUtil,实现代码和C3p0Util的差不多,代码如下:

public class DbcpUtil {

	private String driver = "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://192.168.11.144/first?useUnicode=true&characterEncoding=utf8";
	private String dbusername = "root";
	private String dbpass = "123456";

	public static DbcpUtil dbcpUtil;
	
	private BasicDataSource basicDataSource;

	private DbcpUtil() {
		
		basicDataSource=new BasicDataSource();
		
		basicDataSource.setDriverClassName(driver);
		basicDataSource.setUrl(url);
		basicDataSource.setUsername(dbusername);
		basicDataSource.setPassword(dbpass);
		
		basicDataSource.setMaxActive(15);
		basicDataSource.setMaxIdle(3);
		basicDataSource.setInitialSize(5);

	}

	public static DbcpUtil getInstance() {
		if (dbcpUtil == null) {
			dbcpUtil = new DbcpUtil();
		}
		return dbcpUtil;
	}
	
	public Connection getCon() throws SQLException{
		return basicDataSource.getConnection();
	}

}