JDBC连接池

JDBC优化之连接池

(一)连接池简介

① 为什么使用连接池?
	数据库连接是一种关键的有限的昂贵的资源,传统数据库连接每发出一个请求都要创建一个连接对象,使用完直接关闭不能重复利用;
	关闭资源需要手动完成,一旦忘记会造成内存溢出;
	请求过于频繁的时候,创建连接极其消耗内存;
	而且一旦高并发访问数据库,有可能会造成系统崩溃。
	为了解决这些问题,我们可以使用连接池。
② 连接池原理
	数据库连接池负责分配、管理和释放数据库连接,它的核心思想就是连接复用.
    通过建立一个数据库连接池,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。
    一旦连接池中的连接对象被用完了,判断连接对象的个数是否已达上限,如果没有可以再创建新的连接对象,如果已达上限,用户必须处于等待状态,等待其他用户释放连接对象,直到连接池中有被释放的连接对象了,这时候等待的用户才能获取连接对象,从而操作数据库。
    这样就可以使连接池中的连接得到高效、安全的复用,避免了数据库连接频繁创建、关闭的开销。这项技术明显提高对数据库操作的性能。
③ 连接池的优势
	(1)程序启动时提前创建好连接,不用用户请求时创建,给服务器减轻压力;
	(2)连接关闭的时候不会直接销毁connection,这样能够重复利用;
	(3)如果超过设定的连接数量但是还没有达到最大值,那么可以再创建;
	(4)如果空闲了,会默认销毁(释放)一些连接,让系统性能达到最优;
常用的开源连接池
	1. DBCP 
    	是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持
	2. C3P0
      	是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以
   		Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
   		BoneCP 是一个开源组织提供的数据库连接池,速度快
	3.Druid
    	是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不知道   是否有BoneCP快

(二)连接池的使用:c3p0连接池

① 下载导包 c3p0-0.9.5.2.jar  mchange-commons-java-0.2.11.jar
[https://www.mchange.com/projects/c3p0/](https://www.mchange.com/projects/c3p0/)
第一种方式:代码配置
	1. 创建c3p0连接池对象

image

2 配置信息 (必配)

image

3. 可以选配信息

image

4. 从池子中获取连接

image

代码
 @Test
    public void testInsert() throws PropertyVetoException, SQLException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //配置连接池相关参数 驱动 地址  用户  密码
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day10");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        statement.executeUpdate("insert into user values(null,'赵七','123',20,'男')");
        statement.close();
        //此时close不再直接释放资源,而是把连接返回到连接池中
        //close方法已经被重写 (装饰器模式、代理模式)实现
        connection.close();
    }
第二种方式:配置文件方式  推荐使用
	1 创建 c3p0.xml 放在src目录下 

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<!-- 四项基本配置 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/day10</property>
		<property name="user">root</property>
		<property name="password">root</property>
		
		<!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
  			SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
		<property name="checkoutTimeout">30000</property>
		
		<!--隔多少秒检查连接池的空闲连接,0表示不检查-->
		<property name="idleConnectionTestPeriod">30</property>
		
		<!-- 初始化连接数 -->
		<property name="initialPoolSize">10</property>
		
		<!-- 连接的最大空闲时间,默认为0秒、不会关闭任何连接。设置30秒,30秒到期后,
			连接若未使用就会被关闭 -->
		<property name="maxIdleTime">30</property>
		
		<!-- 池中最多的连接存放数目 -->
		<property name="maxPoolSize">100</property>
		
		<!-- 池中最少的连接存放数目 -->
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>
	</default-config>
	
</c3p0-config>

2 使用
	创建连接池对象 自动读取 配置文件信息
@Test
    public void testDelete() throws PropertyVetoException, SQLException {
        //ComboPooledDataSource 会自动读取src 下 文件名 为c3p0-config.xml
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        statement.executeUpdate("delete from user where id = 3");
        statement.close();
        connection.close();
    }
原文地址:https://www.cnblogs.com/conglingkaishi/p/15232255.html