目录

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

2.什么是连接池

3. 连接池的工作原理

3.1详解连接池的工作原理

3.1.1连接池的创建:

3.1.2 连接池的管理

3.1.3 连接池的关闭

3.1.4相关词组详解

4.连接池的规范

4.1JavaEE规范规定:

4.2常见的第三方连接池

5.如何使用Druid

5.1 导入jar包

5.2 入门案例


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

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

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

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

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

2.什么是连接池

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

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

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

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

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

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

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

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

3. 问题解答:

  • 问题1:一开始连接池会进行系统初始化,根据系统配置建立,并创建几个连接对象【初始化】
  • 问题2:添加的新连接不能超过最大连接数
  • 问题3:自动创建即可。
  1. 如果初始化只有3个连接,但我现在需要第4个连接,该怎么办呢?

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

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

  • 问题4:不能,有最大连接数。最大连接数限制了连接的个数,不能超过最大连接数,不然会报栈内存溢出异常。
  • 问题5:因为有最小连接数,所有不能让池子全部空闲,占内存。所以池子中总是有这么几个连接【最小连接数】在等待着被人连接使用

3. 连接池的工作原理

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

3.1详解连接池的工作原理

3.1.1连接池的创建:

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

3.1.2 连接池的管理

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


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


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


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

3.1.3 连接池的关闭

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

3.1.4相关词组详解

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

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

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

4.连接池的规范

4.1JavaEE规范规定:

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

  2. 接口中规定方法:getConnection()

4.2常见的第三方连接池

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

  • DBCP: Apache提供,tomcat内置。

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

5.如何使用Druid

5.1 导入jar包

  • 方式1:直接导入jar包

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

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

5.2 入门案例

    1. 图集导航

  • 步骤:核心类---> 编写基本参数 --> 特殊设置【对比两次连接是否相同】

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 {@Testpublic 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();}
}
  • 结果展示 【两次获取到的连接的地址值一样】

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

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

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

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

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

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

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

  1. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库

    一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...

  2. [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。...

    引言 自己弄了一个小项目--日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Desc ...

  3. 超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大

    超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大 2008年11月27日 10:11 ASP.NET c#在使用SqlDataReader读取数据的时 ...

  4. 如何连接oracle xe_为什么应始终将连接池与Oracle XE一起使用

    如何连接oracle xe 介绍 Oracle Express Edition是Oracle Enterprise Edition的免费版本,其较小的尺寸使其非常方便地测试各种Oracle功能. 根据 ...

  5. ado.net mysql 连接池_ADO.NET中SQL Server数据库连接池

    实际上,大多数应用程序仅使用一个或几个不同的连接配置. 这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭. 为了使打开的连接成本最低,ADO.NET 使用称为连接池的优化方法. 连接池减少 ...

  6. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...

    在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...

  7. mysql连接池源码_一个JAVA数据库连接池实现源码

    原文链接:http://www.open-open.com/lib/view/open1410875608164.html // // 一个效果非常不错的JAVA数据库连接池. // from:htt ...

  8. oracle中多个数据库连接池,数据库连接池为什么要建立多个连接

    一般程序在访问数据库的时候,都是使用数据库连接池,比如:DBCP,C3P0等等.至于为什么使用连接池,大家都知道,就是为了避免频繁的与数据库建立连接, 因为建立连接是一个比较耗时的操作.而连接池的配置 ...

  9. sybase jz0c0 连接已关闭_Go 基于 channel 实现连接池

    golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池. 何为通用? 连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用 ...

  10. mysql连接池耗尽_定时任务和jdbc连接池的耗尽问题

    最近在一个项目中使用spring的scheduling执行定时任务.简化一下需求,定时进行http请求,把请求的结果放入数据库,这里数据库连接使用c3p0连接池. 问题的描述: 执行了一段时间后,定时 ...

最新文章

  1. Java--日期的使用
  2. dubbo服务使用spring-data-mongodb进行时间查询的bug记录
  3. web前端技术杂谈--css篇(1)--浅谈margin(续)
  4. time包中Parse和Format的区别
  5. mysql 权限命令 revoke_mysql 权限管理使用 grant/revoke
  6. PHP-RSA加密跨域通讯实战
  7. wepy学习笔记之环境搭建
  8. JS中用构造函数创建对象
  9. poi 不自动计算 设置单元格公式_Java POI:如何读取Excel单元格的值而不是计算公式?...
  10. 万年历c语言大作业实验,用C语言写的一个万年历
  11. 汽车辐射监测系统-Qt开发
  12. 使用VMware虚拟机安装Windows XP系统
  13. 活灵活现用 Git --技巧篇
  14. 楚留香服务器维护时间,2019年06月28日官方维护公告
  15. 计算机制造商提供的驱动程序,英特尔通用显卡驱动程序将覆盖计算机制造商(OEM)自定义...
  16. lcov和gcov的使用错误
  17. [转载]如何提高.NET Compact Framework应用程序的性能 - 黎波 - 博客园
  18. 手写笔记图片计算机,如何将手写笔记录入到电脑上?
  19. 金蝶cloud后台数据库表说明
  20. python中vstack作用_numpy中的vstack和hstack

热门文章

  1. 分享一款代码生成工具,可自定义模板生成不同的代码
  2. 【Linux】SCP 拷贝命令
  3. STM32H743IIT6+USB3300,USB_HS高速双向HID通讯开发
  4. 什么软件能测试太阳光照周期,你做的是UV测试,还是太阳光照测试?
  5. ASM Is Unable To Detect SCSI Disks On Windows. [ID 880061.1]
  6. Jenkins下载插件,报java.net.SocketTimeoutException: Read timed out
  7. 大数据精准投放平台_大数据广告精准投放怎么实现的?
  8. 阈值分割:最大类间方差法
  9. 使用Py-OpenCV(SIFT关键点)实现自然图像中的logo商标识别和定位
  10. 基于证据理论的多源数据融合仿真实验matlab代码(源码)