Spring数据库连接池

为什么要使用数据库连接池

数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作会产生大量的性能开销,进而会导致网站的响应速度下降,严重时会导致服务器崩溃。数据库连接池就可以节省许多系统开销。

数据库连接池是什么

数据库连接池(Database Connection Pooling)在程序初始化的时候会创建一定数量的数据库连接对象,并且将其保存在一块内存区域内,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个,同时会释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池不仅负责创建数据库连接,同时还负责分配、管理和释放数据库连接,可以通过配置连接池的参数来控制连接池中的初始连接数、最小连接数、最大连接数、最大空闲时间。

最小连接数:
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

最大连接数:
限定了连接池能储存的最大连接数,如果数据库连接请求超过最大连接数,则新的数据库连接请求将会进入等待队列中,这将造成应用程序因不能立刻获得数据库连接而对程序产生功能性影响。

最小连接数与最大连接数差距:
最小连接数与最大连接数相差太大,最先的连接请求将会获利,之后超过最小连接数的连接请求等价于创建一个新的数据库连接。不过这些大于最小连接数的数据库连接用完之后不会立马被释放掉,而是等待重复使用,或者等它超过了最大空闲时间时再被释放。

原理

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

常用的数据库连接池

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

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

3、Druid:Druid数据库连接池是阿里巴巴开源平台上的一个开源项目,该连接池性能高效,简单SQL语句用时10微秒以内,复杂SQL用时30微秒。官网:https://github.com/alibaba/druid

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

Spring连接池配置

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" lazy-init="false" destroy-method="close">
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"></property>	
	<property name="username" value="root"></property>	
	<property name="password" value="root"></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>

为了便于系统的维护和管理,常常将文件路径或数据源配置等信息定义在properties文件中,但这些信息有时需要在配置Spring xml文件时读取到,为此Spring提供了一个PropertyPlaceholderConfigurer类,在Spring配置文件中配置PropertyPlaceholderConfigurer并为其location变量指定properties文件路径,然后即可使用${}的形式将properties文件中的配置信息读取出来,例子如下:

<!-- 配置PropertyPlaceholderConfigurer如下 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">	
	<property name="location" value="classpath:config/jdbc.properties"></property>
</bean>

<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" lazy-init="false" destroy-method="close">
	<property name="driverClassName" value="${driverClassName}"></property>	
	<property name="jdbcUrl" value="${jdbcUrl}"></property>	
	<property name="username" value="${username}"></property>	
	<property name="password" value="${password}"></property>	
	<property name="readOnly" value="${readOnly}" /> 	
	<property name="connectionTimeout" value="${connectionTimeout}" /> 	
	<property name="idleTimeout" value="${idleTimeout}" /> 	
	<property name="maxLifetime" value="${maxLifetime}" /> 	
	<property name="maximumPoolSize" value="${maximumPoolSize}" />
</bean>

在Spring 2.5之后,Spring提供了一个context命名空间,通过context:property-placeholder可以简化上面第一个bean中代码:

<context:property-placeholder location="classpath:config/jdbc.properties"/>
发布了101 篇原创文章 · 获赞 3 · 访问量 2244

猜你喜欢

转载自blog.csdn.net/S_Tian/article/details/104206007