数据库连接池

数据库连接池
**一、什么是数据库连接池**
  数据库连接是一种关键的、有限的、昂贵的资源。每次用户获取数据库连接都需要消耗较大的资源,数据库连接池可以管理连接,可以重复使用连接而不需要每次都进行创建。使用池来管理连接的生命周期,可以节省资源,提高性能。用池来管理Connection,这可以重复使用Connection。有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。数据库连接池的原理通俗地说:先创建好几个数据库放在池里,等系统需要用了直接去连接,并做上标记(连接),用完后再将数据库连接还回到池里,同时做上标记(空闲)。当有连接需求时,此时又没有空闲数据库连接,则会新建立连接放入池中。而这些参数我们都可以自己进行配置,如:   - 初始大小:10个   - 最小空闲连接数:3个   - 增量:一次创建的最小单位(5个)   - 最大空闲连接数:12个   - 最大连接数:20个   - 最大的等待时间:1000毫秒 **二、常见连接池**   这里总结下两个常见的连接池:DBCP和c3p0。导包是使用数据库连接池的第一步,   1.DBCP:**导jar包,commons-pool.jar、commons-dbcp.jar**   DBCP是Apache提供的一款开源免费的数据库连接池。
	public void demo1() throws SQLException {
		//导入核心类:BasicDataSource
		BasicDataSource ds = new BasicDataSource();

		//基本配置
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
		ds.setUsername("root");
		ds.setPassword("123");
		
		//最大连接数		
		ds.setMaxActive(20); 
		//最大空闲连接数:表示即使没有数据库连接时依然可以保持10个空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。	
		ds.setMaxIdle(10); 
		//初始化连接数	
		ds.setInitialSize(10) ;
		//最小空闲连接数	
		ds.setMinIdle(2) ;
		//最大等待毫秒数
		ds.setMaxWait(1000) ;
		
		Connection con = ds.getConnection();
		//只是将连接归还池
		con.close() ;
}
  2.c3p0:**导jar包,c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar**   c3p0也是开源免费的连接池!
public void demo2() throws PropertyVetoException, SQLException {
	//导入核心类:ComboPooledDataSource
	ComboPooledDataSource ds = new ComboPooledDataSource();
	//基本配置
	ds.setDriverClass("com.mysql.jdbc.Driver");
	ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
	ds.setUser("root");
	ds.setPassword("123");
	
	
	//每次的增量为5
	ds.setAcquireIncrement(5) ;
	//初始化连接数为20
	ds.setInitialPoolSize(20) ;
	//最少连接数为2
	ds.setMinPoolSize(2) ;
	//最大连接数为50
	ds.setMaxPoolSize(50) ;
	
	Connection con = ds.getConnection();
	//只是将连接归还池
	con.close();
}

  使用配置文件进行连接,有两个要求:(1)配置文件:c3p0-config.xml;(2)文件位置:src下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config> 
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">123</property>
		<property name="acquireIncrement">3</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">2</property>
		<property name="maxPoolSize">10</property>
	</default-config>
</c3p0-config>

  c3p0的配置文件中可以配置多个连接信息,可以给每个配置起个名字,这样可以方便的通过配置名称来切换配置信息。上面文件中默认配置为mysql的配置,名为test-config的配置也是mysql的配置。此时可以使用有参构造器进行指定配置信息:ComboPooledDataSource ds = new ComboPooledDataSource("test-config") 。

	<named-config name="test-config"> 
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">123</property>
		<property name="acquireIncrement">3</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">2</property>
		<property name="maxPoolSize">10</property>
	</named-config>

文末:不知道大家有没有对c3p0这个连接池名字好奇,网上查了下c3p0的全称,发现了一个小故事:
据传闻:c3p0连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。C3P0就是下图中的右边的那个机器人。左边是他哥哥R2D2。(小故事来源:https://blog.csdn.net/wang_xuaohao/article/details/8565864)

posted @ 2018-07-18 12:02  阿梅AM  阅读(115)  评论(0)    收藏  举报