解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的连接池技术
最近在连接池上面栽了个跟头(参见这里),引起我对池技术的强烈关注,这几天总结了一下很多场景都会使用的池技术;
池概念
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都在使用的连接池技术的更多相关文章
- 开源的连接池技术DBCP和C3P0
概述: Sun公司约定: 如果是连接池技术,需要实现一个接口! javax.sql.DataSource; 相关jar包和资料下载 1.1 DBCP连接池: l DBCP 是 Apache 软 ...
- JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生
一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...
- 采用DBCP连接池技术管理连接
DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...
- Java Redis系列3(Jedis的使用+jedis连接池技术)
Jedis的使用 什么是Jedis? 一款Java操作redis数据库的工具 使用步骤 1.下载redis所需的java包 2.使用步骤 import org.junit.Test; public c ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DBCP、c3p0、Druid三大连接池区别
DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
随机推荐
- 阿里OSS 渗透案例
采用JavaScript客户端直接签名时,AccessKeyID和AcessKeySecret会暴露在前端页面,因此存在严重的安全隐患. 渗透案例 阿里云Access Token问题 - 项目收获记录 ...
- 【题解】Typesetting [Hdu6107]
[题解]Typesetting [Hdu6107] 传送门:\(\text{Typesetting}\) \(\text{[Hdu6107]}\) [题目描述] 有一篇行数无限宽度 \(MaxW\) ...
- F#周报2019年第23期
新闻 支持社区的WF与WCF开源项目 视频及幻灯片 F# MonoGame平台游戏系列:摄像头 Xamarin.Forms的F#与Fabulous ML.NET端到端之二:构建Web API 使用F# ...
- UWP 推荐 - 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10
文/云之幻 前不久,博客作者 Bravo Yeung 写了一篇还算略受欢迎的关于 RSS 的文章 .Net开发者必知的技术类RSS订阅指南. RSS 现在用的人很少了,而且就算是我,也不过是在一周前才 ...
- WPF树形菜单--递归与非递归遍历生成树结构的集合
一.新建了WPF项目作为测试,使用TreeView控件进行界面展示. 第一步创建实体类TreeEntity: public class TreeEntity { private int _mid; p ...
- FFT之频率与幅值的确定(转)
FFT之后得到的是什么数 FFT之后得到的那一串复数是波形对应频率下的幅度特征,注意这个是幅度特征不是复制,下面要讲两个问题:1.如何获取频率,2.如何获取幅值 获取频率 FFT变换如何获取频率?傅里 ...
- 相同域名下的cookie污染
问题描述 本地用同一个tomcat调试两个相同框架的不同项目,在同一个浏览器界面里切换时,A项目的登录会把B项目的登录给踢掉,翻反过来亦如此.通过查看浏览器cookie,发现两个项目的cookie完全 ...
- Linux Tools 之 iostat 工具总结
iostat是Linux中被用来监控系统的I/O设备活动情况的工具,是input/output statistics的缩写.它可以生成三种类型的报告: CPU利用率报告 设备利用率报告 网络文件系统报 ...
- (转)linux内核虚拟文件系统浅析【转】
转自:https://www.cnblogs.com/woainilsr/p/3590716.html 转自http://hi.baidu.com/_kouu/item/4e9db8758032824 ...
- jenkins使用小技巧:jenkins构建出来的war/jar包如何带上SVN号?
在实际使用过程中,一般会这样比如说打出来的包是 mypackage.jar, 但是每次打出来都是固定的 mypackage.jar如何来区分和上一个包的区别呢? 一般来说,会把打出来的包带上个 svn ...