【Spring】数据库连接池及其在Spring中如何配置

什么是数据库连接池:

定义:数据库连接池(Database Connection Pooling):数据库连接池是计算机内存中的一块内存,它存储了一些已经创建好的数据库连接对象。数据库连接池负责创建数据库连接,还负责分配、管理和释放数据库连接。
原理

  • 当程序初始化时创建一定数量的连接对象;
  • 应用程序需要访问数据库时,就从数据库连接池中获得一个创建好的连接对象,应用程序结束访问后,释放的连接对象回到空闲状态等待下次被使用;
  • 如果应用程序请求链接对象时,已经创建的连接对象都处于使用状态,数据库连接池将会创建新的连接对象给该用户使用;
  • 如果数据库连接池的连接对象数量等于最大连接数了,那么数据库连接池就不会再创建新的连接对象了,应用程序只能等待有空闲的连接对象;
  • 数据库连接池中空闲时间超过最大空闲时间的连接对象将会被删除,直到剩下最小连接数的连接对象。

最小连接数:程序初始化时会创建这个数量的连接对象,数据库连接池中最少会有的这个数量的连接对象,只要连接对象等于这个数,即使连接对象空闲时间超过了最大空闲时间也不会被删除。
最大连接数:数据库连接池的容量。即使需要使用连接对象的应用程序再多,数据库连接池也不会创建超过这个数量的连接对象。
最大空闲时间:连接对象也是需要占用内存的,如果数据库连接池中的连接对象的空闲时间超过这个时间,那么它将会被删除,除非数据库连接池中的连接对象数量等于最小连接数。

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

创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的时候可能导致服务器崩溃。而使用数据库连接池可以在很大程度上缓解这个问题。

有哪些常用的连接池:

  • DBCP:DBCP(DataBase connection pool)数据库连接池是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件;单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar.dbcp没有自动回收空闲连接的功能。前往官网
  • C3P0:C3P0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。注: JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。前往官网
  • Druid:Druid数据库连接池是阿里巴巴开源平台上的一个开源项目,该连接池性能高效,简单SQL语句用时10微秒以内,复杂SQL用时30微秒。前往官网
  • HikariCP:HikariCP数据库连接池尽管是后起之秀,但却PK掉其它数据库连接池技术,成为目前速度最快的数据库连接池,SpringBoot2.0也已经采用HikariCP作为默认连接池配置。前往官网

Spring如何配置数据库连接池:以HikariCP为例

导入jar包是必不可少的环节…不再详述,只说如何配置…

方式一:

在spring的xml核心配置文件中配置:

<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/mytest?characterEncoding=utf8"></property>
	<property name="username" value="root"></property>
	<property name="password" value="1234"></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文件中的配置信息读取出来。
在src目录下新建一个文件夹“config”,并在其中创建一个文件“jdbc.properties”:

driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username=root
password=1234
readOnly=false
connectionTimeout=30000
idleTimeout=600000
maxLifetime=1800000
maximumPoolSize=15

此时spring的xml核心配置文件中配置方式如下:

<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>

也可以不使用PropertyPlaceholderConfigurer类,而使用context:property-placeholder标签指定properties文件路径:

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

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/104201026
今日推荐