在系统中频繁的进行数据库连接的创建和释放是非常浪费计算机资源的行为,而数据库连接池能够有效的缓解这种行为。

数据库连接池(Database Connection Pooling)是在程序初始化时创建一定数量的数据库连接对象并保存在内存中,应用成勋可以重复的使用这些数据库连接对象。

在数据库连接池中有这样几个概念:

最小连接数:即数据库连接池中初始化存在的数据库连接对象数目。若应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

最大连接数:即数据库连接池中能存放的最大连接数,若请求的连接数大于该数值,则超过的数据库连接请求放入等待队列等待。这会造成应用程序因不能立刻获得数据库连接而对程序产生功能性影响。

当请求连接时,小于最小连接数的请求将会立即得到,之后超过的连接请求需要为他们建立一个新的数据库连接。而这些新创建的数据库连接在使用完毕之后不会被立即释放,他们将会在连接池中等待重复使用或空闲超时之后被释放。

原理流程:

程序初始化时创建一定数据量的数据库连接对象存储在内存中,当程序需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象;如果连接池内没有空闲连接,连接池创建新的数据库连接对象并将这个连接对象提供给应用程序使用,应用程序用完后,数据库连接池不会立刻关闭该连接,在空闲时间超过最大空闲时间时,该连接才被关闭; 如果数据库连接请求超过最大连接数,则该数据库连接请求被加入到等待队列中;程序退出时,数据库连接池断开所有连接并释放资源。

 

常用连接池

1、DBCP:DBCP(DataBase connection pool)数据库连接池是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件;单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar.dbcp没有自动回收空闲连接的功能。

2、C3P0:C3P0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。注: JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。

3、Druid:

Druid数据库连接池是阿里巴巴开源平台上的一个开源项目,该连接池性能高效,简单SQL语句用时10微秒以内,复杂SQL用时30微秒。

4、HikariCP:

HikariCP数据库连接池尽管是后起之秀,但却PK掉其它数据库连接池技术,成为目前速度最快的数据库连接池,SpringBoot2.0也已经采用HikariCP作为默认连接池配置。

所以我们用HikariCP看一下如何配置连接池。

首先你需要HikariCP的架包

JavaMySQL数据库释放链接 java数据库连接池满了_连接池

这个在官网上很容易就可以得到。

之后在xml中代码配置

<bean id= "dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" p:password="root" p:username="root" >
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/testone"></property>
        <!-- 连接只读数据库时配置为true, 保证安全 -->
	<property name="readOnly" value="false" /> 
	<!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
	<property name="connectionTimeout" value="30000" /> 
	<!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
	<property name="idleTimeout" value="600000" /> 
	<!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
	<property name="maxLifetime" value="1800000" /> 
	<!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
	<property name="maximumPoolSize" value="15" />

</bean>

ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("application.xml");

System.out.println(application.getBean("dataSource"));

application.close();