最近在连接池上面栽了个跟头(参见这里),引起我对池技术的强烈关注,这几天总结了一下很多场景都会使用的池技术;

池概念

pool,中文翻译为水池,但是在英文中,还有一种解释是

an organization of people or resources that can be shared;

不知道古代中文是否包含共享资源的意思,欧美语言中,池就是有资源共享的意思;

为什么要采用池技术

精确的说,应该是为什么要使用连接池技术;我们先看看这些使用池技术的组件都有哪些,httpclient HTTP协议组件,dbcp数据库连接池,jedis redis客户端;可以说代表了三种截然不同的应用场景;但是他们背后,却都有一个共同点,那就是TCP长连接;

综上,我个人认为主要是出于以下几方面

1、TCP连接每次建立和释放都比较耗时,特别是对于小的HTTP请求,如果能在业务调用时省去这段时间,则业务代码性能更好,这就需要提前建立TCP连接或者事后释放TCP连接;

2、业务代码会存在多次资源调用,但是不希望TCP连接对象在多次调用之间传来传去,这样会让代码变的复杂;

3、组件希望提供更友好的接口,而将底层的TCP技术使用池进行了封装;

有些人可能对长短连接概念不是很清楚,大家可以简单的认为,像HTTP协议请求完就会与服务器的连接断掉是短连接,通常我们上网都是短连接。像开发过程中使用的数据库客户端,一般会长时间与数据库维持一个TCP连接,这个可以就认为是长连接。除了DB,还有redis,java中的RMI等协议都是长连接;

长连接比短连接各有优劣:

好处:省去每次TCP3次握手和4次挥手的过程,发送请求和响应耗时更短;

坏处:服务器切换影响比较大,通常只能通过强制手段让客户端重新建立连接才能完成后端服务的切换;单纯从运维角度看,长连接非常不提倡;

池抽象

如果画一张图,我想应该是这样

就是在一个大池子里面,有好多资源。这些资源随时可能被拿出去占用或者随时有新的资源被归还,好借好还,再借不难;正常情况应该是这样

这就是池技术的基本原理,这个模型很重要,httpclient,dbcp,jedis,c3p0,druid,okhttp这些组件都使用到了池技术,大家可以自行去官网查看;下面我再抽几个重点场景给大家几个常见的重要配置参数;

连接池总资源数

既然是池,其容量总是有限制的,并且不同的组件,其总量限制默认都很低。

组件

最大资源数属性

默认最大资源数

httpclient4

MaxTotal

20

jedis2

maxTotal

8

druid

maxActive

8

c3p0

maxPoolSize

15

关于httpclient,还要特殊说明一下,这个maxTotal,存在误区,可以参见这里

那么问题来了,如果TCP连接的另外一端响应突然变慢,导致租户无法及时归还资源,新的用户又要借用,但连接池中没有资源了,组件会如何处理?

答案是;而且,如果你没有修改默认设置的话,默认是无限的等;你可能会说,我不相等,我想让系统有自我保护功能,当后端依赖出现问题的时候,我们尽快的反馈给调用方,而不是把自己耗死;OK,你的想法很不错,但是你需要修改配置,让调用方不是无限等,可以设置调用方不等或者等待有限时间

组件

属性

httpclient4

RequestConfig.ConnectionRequestTimeout

jedis2

MaxWaitMillis

druid

maxWait

c3p0

breakAfterAcquireFailure

dbcp

maxWaitMillis

TCP连接的问题

因为网络协议太复杂了,当组件采用池技术后,一系列后遗症也逐渐暴露出来;有时发现从池中取出连接使用时,发现连接已经被服务器端关闭了;并且这种情况,各种池组件无法感知(这个说起来又能说一篇),这些连接在英文中称为stale;针对这种情况,各种组件基本上围绕使用流程在使用前,使用后以及定时任务清理三种策略来避免这种情况;

使用前

组件通常采用在用户代码请求时,组件先自己测试TCP连接是否还可用,但是这种手段通常仅对DB连接池组件有效;如dbcp组件,通常会向服务器端发送一个测试sql来测试连接是否还可用;

使用后

同使用前检测一样,这种方法也是通常应用在数据库连接池中;在数据库出现问题时,通常连接已经不可用,这个时候再return给连接池,也会给其他后申请者造成影响,不如直接释放连接,后续再建立新的连接;

定期检测

通常连接池在不同的时间,池中空闲的连接数量是不同的,在业务低峰期,长时间维持一些没用的连接也是一种浪费。通常这个时候会有一个定时任务来定期清理长期不活跃的连接。具体的清理策略各式各样,有按照连接时长清理的,有按照长时间没有活动清理的。这个清理又会涉及很多参数设置,大家可以自行阅读参考;

另外,在数据库连接池中针对低峰期空闲连接多的问题(通常会导致系统time_wait多的问题),连接池通常还有一个最大空闲连接数(maxIdle)和最小空闲连接数(minIdle)两个参数,这两个参数的含义如下:

minIdle:保证池中最少要有minIdle个空闲的连接可用。如果少于这个数,则开始预创建连接;

maxIdle:保证池中最多有maxIdle个空闲的连接,当连接池被不断归还时,如果空闲连接数超过maxIdle,则开始对空闲的连接数进行释放。

最后还有一点,druid,dbcp和jedis池技术都是采用或者参考的apache的common-pool,很多参数都跟common-pool一样。okhttp是后起之秀,虽然也使用了池技术,但是在同步调用中,并没有对池的大小设置闲置,可以认为,okhttp是一个无限制的连接池;

搜索公众号“猿界汪汪队”,关注更多有深度的文章;

参考资料:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

http://commons.apache.org/proper/commons-dbcp/configuration.html

https://www.mchange.com/projects/c3p0/#configuration_properties

解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的连接池技术的更多相关文章

  1. 开源的连接池技术DBCP和C3P0

    概述: Sun公司约定: 如果是连接池技术,需要实现一个接口! javax.sql.DataSource;   相关jar包和资料下载 1.1  DBCP连接池: l  DBCP 是 Apache 软 ...

  2. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...

  3. 采用DBCP连接池技术管理连接

    DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...

  4. Java Redis系列3(Jedis的使用+jedis连接池技术)

    Jedis的使用 什么是Jedis? 一款Java操作redis数据库的工具 使用步骤 1.下载redis所需的java包 2.使用步骤 import org.junit.Test; public c ...

  5. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  6. java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  7. DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  8. DBCP、c3p0、Druid三大连接池区别

    DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...

  9. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

随机推荐

  1. RHCE实验记录总结-2-RHCE

    RHCSA实验总结-点击跳转 RHCE实验 RHCE这边我简单分了下类: ## 网络与安全 1. IPv6 设置(推荐使用GUI程序 nm-connection-editor来完成) 2. team ...

  2. 使用 jQuery.TypeAhead 让文本框自动完成 (一)(最简单的用法)

    项目地址:https://github.com/twitter/typeahead.js 直接贴代码了: @section headSection { <script type="te ...

  3. 基于SqlClient开发SQLServer工具类 伸手党的福音

    注意:代码直接Copy调用即可,SQLServer工具类跟我上一个Oracle工具类有所不同,区别在于调用存储过程中时参数的使用,无需输入对应的存储游标名称 特点:根据用户传入的参数类型来识别存储中对 ...

  4. SPC软控件提供商NWA的产品在各行业的应用(生命科学行业)

    在上一篇文章中,我们提到了NWA软件产品在各行业都有广泛的应用,并且就化工行业的应用展开了详细介绍.而在本文中,您将看到NWA产品在生命科学行业也扮演着不可替代的角色. Northwest Analy ...

  5. 【转】合并两个List并去掉重复项

    原文:https://my.oschina.net/jack90john/blog/1493170 工作中很多时候需要用到合并两个List并去除其中的重复内容.这是一个很简单的操作,这里主要是记录一下 ...

  6. 软工Alpha七天冲刺

    七天冲刺博客: 1.第一篇Scrum冲刺博客 2.第二篇Scrum冲刺博客 3.第三篇Scrum冲刺博客 4.第四篇Scrum冲刺博客 5.第五篇Scrum冲刺博客 6.第六篇Scrum冲刺博客 7. ...

  7. X264-libx264编码库

    X264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换.量化,最后熵编码所得. 编码帧的类型分为I帧(x264_type_i).P帧( ...

  8. [MySQL] 为什么要给表加上主键

    1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」.如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结 ...

  9. c++ win32下窗口的最小化到托盘以及还原

    框架是用visual studio创建的win32控制台模板,然后自己添加最小化及还原部分代码. 需要额外包含的头文件: #include <shellapi.h> #include &l ...

  10. SQL之单表与多表查询

    DML语句使用 source  路径  :把SQL脚本导入到数据库中 查询语句类型:[简单查询|多表查询|子查询] 投影:select    字段名,字段名   from   表名   where   ...