简述数据库连接池

文章目录

为什么

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

是什么

  • 数据库连接池概念(Database Connection Pooling)

在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池不仅负责创建数据库连接,还负责分配、管理和释放数据库连接,可以通过配置连接池的参数来控制连接池中的初始连接数、最小连接、最大连接、最大空闲时间等。

  • 最小连接数

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

  • 最大连接数

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

  • 最小连接数与最大连接数差距

最小连接数与最大连接数相差太大,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放

  • 原理

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

  • 常用连接池

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

在这里插入图片描述
beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="jdbcUrl" value="jdbc:mysql:/127.0.0.1/test"></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>
</beans>

log4j.properties

# DEBUG\u8BBE\u7F6E\u8F93\u51FA\u65E5\u5FD7\u7EA7\u522B\uFF0C\u7531\u4E8E\u4E3ADEBUG\uFF0C\u6240\u4EE5ERROR\u3001WARN\u548CINFO \u7EA7\u522B\u65E5\u5FD7\u4FE1\u606F\u4E5F\u4F1A\u663E\u793A\u51FA\u6765
log4j.rootLogger=DEBUG,Console,RollingFile

#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n

Test类:

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zaxxer.hikari.HikariDataSource;

public class Test {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		HikariDataSource hikariDataSource = applicationContext.getBean(HikariDataSource.class);
		System.out.println(hikariDataSource);
		applicationContext.close();
	}
}

执行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值