什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?

简介: 什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?

1.为什么需要连接池呢?


Java程序操作数据库,必须获得一个连接Connection


实际操作中,我们要先获得连接,使用完成后还有关闭连接。这两个操作都比较耗时。


思考:那有没有什么比较方便不耗时的方法呢?当我们要用的时候只需要调用一下就ok,用完了再还回去。这样岂不是免去了【获得、关闭连接】节省了很多时间?那应该怎么实现呢?


答疑:连接池,就是用于解决这一问题而被需要的。连接池,将我们所需要的连接,放入池子里,形成公共连接。且该池子中的连接被调用时,有且只能被一个人使用,当该连接被归还时,即可恢复为公共连接,被别人重新调用。


2.什么是连接池


一组连接组成的一个池子(集合),称为连接池。


1接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。


在描述连接池的工作原理前,先思考思考几个问题???


问题1:连接池中的连接一开始有几个?


问题2:如果新添加了连接,一次能添加几个?


问题3:如果需要的连接比池子中的连接多,该怎么办?


问题4:是否可以无限添加连接?


问题5:如果都归还连接呢?


 3. 问题解答:


问题1:一开始连接池会进行系统初始化,根据系统配置建立,并创建几个连接对象【初始化】

问题2:添加的新连接不能超过最大连接数

问题3:自动创建即可。

如果初始化只有3个连接,但我现在需要第4个连接,该怎么办呢?


第4个连接我们可以自动创建,但是随着我们的需求越来越多,自动创建连接可以无限创建吗?


不能,因为连接池中有最大连接数,最大连接数限制了连接的个数,超过了最大连接数就会报错,栈内存溢出异常


问题4:不能,有最大连接数。最大连接数限制了连接的个数,不能超过最大连接数,不然会报栈内存溢出异常。

问题5:因为有最小连接数,所有不能让池子全部空闲,占内存。所以池子中总是有这么几个连接【最小连接数】在等待着被人连接使用


3. 连接池的工作原理


下面我们用图片的形式,模拟一下连接池的工作原理


48d99867ed454f83b540a5db0b643c36.png


3.1详解连接池的工作原理


3.1.1连接池的创建:


当用户需要访问数据库时,连接池会根据系统初始化,根据系统配置建立。并创建几个连接对象,等待着被需要的用户连接


3.1.2 连接池的管理


1.用户根据需要去连接池获取一个独享连接进行复用;


2.这时连接池接到用户的请求,会从连接池中随意移出一个空闲的连接给用户。如果没有空闲连接,且尚未达到连接的最大连接数,就是 创建一个新的连接,在将新的连接交给用户。如果没有空闲连接,且也已经达到最大连接数的限制,则程序会先让其等待一段时间,如果超过了等待的时间还没有其他空闲的连接,那么程序则会报栈内存溢出异常。


3.当用户获得连接使用完毕后,会将其连接归还给连接池 。在归还连接时,会对其连接池中的连接进行判断,看是否达到最大空闲数,如果已经达到看最大空闲数,已经没有空闲的位置了,那么就会直接将该对象丢弃。如果归还连接时,连接池中的连接小于最小空闲数,则会创建新的对象,来保证连接数大于等于最小空闲数【最小连接数】


4.其实,在我们归还连接后,对于 大于最小空闲和小于最大空闲时,会根据连接的最小空闲时间,做空闲连接检测,如果该连接空闲的时间超过了最小空闲时间,则会将其移除,清除清理掉。【大于最小空闲连接:就是在最小连接是基础上,多出来的那个或几个连接;】【 小于最大空闲连接:就是如最大空闲数是5个,现在却只有4个空闲,则现在的空闲数就小于了最大空闲数,反过来说也就是大于最小空闲数。因为,最大连接数 = 最小连接数+最大空闲数,而最小连接数其实又是最小空闲数即:最大连接数=最小空闲数+最大空闲数,不管那边发生改变都将会造成影响,天平的两端都将不会平衡】


3.1.3 连接池的关闭


当应用程序关闭时,会关闭连接池中的所有连接,释放连接池中相关的资源。但也不是将所有的连接全部关闭,因为如果将其全部关闭了不仅仅占内存,而且如果下一次有用户要进行复用连接的时候,还降低了效率。所有连接池有一个最小连接数,当关闭程序时,连接池会留下几个连接继续处于空闲等待状态,等待着被其他用户连接,其他连接则会被关闭释放资源,连接池就只剩下最小连接数个连接。


3.1.4相关词组详解


最大连接数:意思就是在这个连接池中最大可以存放多少个连接


最小连接数:意思就是在这个连接池中至少要存在多少个连接,一般系统进行初始化时创建的连接的个数可视为最小连接数


最大空闲数:意思就是在最大连接数中除去最小连接数的个数,还剩下多少个连接,可视为可以最大,最多能空闲下来的连接数


4.连接池的规范


4.1JavaEE规范规定:


JavaEE规范规定:连接池必须实现javax.sql.DataSource 接口


接口中规定方法:getConnection()


c68d47aa1b16404683d6844bc7ca111a.png


4.2常见的第三方连接池


druid: 德鲁伊,alibaba提供,稳定,性能好等。


DBCP: Apache提供,tomcat内置。


C3P0 : hibernate 框架底层使用。(等效框架MyBatis)


5.如何使用Druid


5.1 导入jar包


方式1:直接导入jar包


f2a7fa6cc90543868630c32e9873a9a2.png


方式2:在pom.xml中导入Druid坐标

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.2.4</version>
 </dependency>

5.2 入门案例

  1. 图集导航


aa138ffea791446599359c5bb393a270.png


  • 步骤:核心类---> 编写基本参数 --> 特殊设置【对比两次连接是否相同】
package com.czxy;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Test;
import java.sql.SQLException;
public class TestDruid {
    @Test
    public void testDemo() throws SQLException {
        //1 获得连接池
        //1.1 核心类
        DruidDataSource dataSource = new DruidDataSource();
        //1.2 基本4项
        //  1) 驱动
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        //  2) 连接
        dataSource.setUrl("jdbc:mysql://localhost:3306/ssm_db1");
        //  3) 用户
        dataSource.setUsername("root");
        //  4) 密码
        dataSource.setPassword("1234");
        //1.3 特殊项【可选】
        // 1) 初始化大小
        dataSource.setInitialSize(5);
        // 2) 最大值活动数
        dataSource.setMaxActive(10);
        // 3) 最小空闲数
        dataSource.setMinIdle(2);
        //2 从连接池中获得连接
        //对比两次获取到的连接是否一致
        DruidPooledConnection conn = dataSource.getConnection();
        System.out.println(conn);
         //用完了,返还到连接池中
        conn.close();
        DruidPooledConnection conn2 = dataSource.getConnection();
        System.out.println(conn2);
        conn2.close();
    }
}


结果展示 【两次获取到的连接的地址值一样】


结果输出的地址是一样的,


这就说明当第一次获取连接时后,使用完成,用完了把连接归还了回去


而第二次在获取连接时,之前获取的连接已经归还,现在空闲,又一次的获取了该连接


c1d3e3cf61974be1b0f70f98ac7e765e.png


----------  如果第一次获取到的连接没有返还回去,那么所得到的连接地址会一样吗?答案是否定的

 //2 从连接池中获得连接
        //对比两次获取到的连接是否一致
        DruidPooledConnection conn = dataSource.getConnection();
        System.out.println(conn);
         //用完了,返还到连接池中
//将其释放资源,进行删除,不进行归还处理
//       connection.close();
        DruidPooled Connection conn2 = dataSource.getConnection();
        System.out.println(conn2);
        conn2.close();

图集指明具体更改位置

02856b98e0114b27a4f0fa8072fe6f1a.png


更改后测试类结果【获取的两个连接的地址值不同】

7fa414bcdc454bf5b85c524133e3b6ab.png



相关文章
|
存储 缓存 监控
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出 本文来带大家学习Java OOM的三大经典场景以及解决方案,保证让你有所收获!
6999 2
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
13306 2
Spring Boot 3 集成 Druid 连接池详解
|
druid 网络协议 Java
再有人问你数据库连接池的原理,这篇文章甩给他!
在 Spring Boot 项目中,数据库连接池已经成为标配,然而,我曾经遇到过不少连接池异常导致业务错误的事故。很多经验丰富的工程师也可能不小心在这方面出现问题。 在这篇文章中,我们将探讨数据库连接池,深入解析其实现机制,以便更好地理解和规避潜在的风险。
|
监控 数据库连接 测试技术
《深入数据库连接池:解锁其核心作用与配置奥秘》
在数字化时代,数据库连接池作为数据库访问架构中的核心组件,通过资源重用、提升响应速度、优化资源分配和防止泄漏等方式,显著提高系统性能与稳定性。其关键在于合理选择连接池库(如HikariCP、Apache DBCP等),并科学配置参数(如初始连接数、最大/最小连接数、超时时间等)。结合性能测试与监控优化配置,可构建高性能、高可靠性的应用系统,满足业务需求。
373 5
|
存储 安全 Java
2025 年一线互联网大厂最新高质量 Java 面试八股文整理及答案汇总
本文整理了一线互联网大厂最新的高质量Java面试八股文及其答案,涵盖Java基础、集合框架与多线程三大核心模块。内容包括面向对象与面向过程的区别、`equals`与`==`的差异、`final`和`static`的用法、集合类如`ArrayList`与`LinkedList`的对比、`HashMap`的工作原理及其与`Hashtable`的区别,以及多线程中的线程创建方式、生命周期、上下文切换和死锁等知识点。通过系统化的梳理与解析,帮助读者高效备考Java面试,掌握核心技术要点。资源可从文末链接下载。
2921 40
|
前端开发 Java 数据库
2025 年 Java 学习完整步骤及详细路线指南
本教程涵盖Java从基础到高级的完整学习路径,包括环境配置、语法基础、面向对象编程、集合框架、多线程、网络编程、数据库操作、Spring Boot、微服务架构及项目实战。通过系统学习与实操,助你全面掌握Java核心技术与企业级应用开发。
1498 0
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
18107 4
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
15810 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
18002 7
|
网络协议 算法 网络性能优化

热门文章

最新文章