Apache Commons Pool 故事一则 专题
Apache Commons Pool 故事一则
最近工作中遇到一个由于对commons-pool的使用不当而引发的问题,习得正确的使用姿势后,写下这个简单的故事,帮助理解Apache Commons Pool的工作原理。
Apache Commons Pool, Java界无人不知无人不晓的对象池技术, 常用于实现各种连接池, 如数据库连接池, Redis连接池等
下面以租车公司为例子说明这张图,介绍commons pool的基本工作方式:

GenericObjectPool(租车公司)
作为租车公司,需要提供租车和收回归还的车辆的两个服务,同时它还要管理着所有的那些车辆,随着业务发展壮大,需要买新车;对于已经不能安全驾驶的车辆,需要将其销毁;同时还要定期对车辆进行安全检测等。
PooledObject(租车公司的所有车辆)
租车公司的车辆分为三类:空闲可租用的车辆(Idle Objects),已借出的车辆(Active Objects),认为已丢弃的车辆(Anandoned Objects)
Borrow Object(租车)
- A1: 世界那么大,一位年轻人想租辆车出去逛逛
- A2: 老板先看看有没有空闲的车
- A3.1: 如果有,则将最近归还的车借出去,并标记为已借出(Active),如果没有空闲的车了,就买辆,同时也标记为已借出(这是一家不差钱的公司)
- A3.2: 老板把标记好的车租给年轻人
Return Object(还车)
- B1: 世界那么大,年轻人终于逛完了,回来还车
- B2: 老板把车放回停车场,并把标记改为空闲状态(Idle),可以再被其他人租用。
TestOnBorrow/TestOnReturn(租出/归还时进行检查)
这 家公司不仅不差钱,它对车辆的安全还很负责,对于租出去的车,不管是从空闲车辆里取出的,还是新买回的,都会先检查一遍这车的好坏,总不能坑了年轻人,如 果发现有问题,立马再换一辆。归还的时候,也会检查一遍,如果有问题,就扔掉(真土豪),除此之外,公司还专门请了一位车辆安检员,定期对闲置了一段时间 的车辆进行安全检测(Evict Thread),一有问题也扔掉。
有借有还,看上去一切都很美好。
然而现实里总有意外发生:
年轻人借走车后,发现世界越逛越大,久久不愿回家。安检员定期检查时发现这车子都借出去大半年了,还没还回来,是不是丢了?于是掏出手机,”啪“的按了一下,远程将车子熄了火,标记为报废车辆(Abandoned),当作报废处理了。
Evict Thread(定期检查的安检人员)
- C1: 对于已归还标记为空闲的车辆,安检员定期对它们抽查,如果超过一段时间没有使用,看看是否坏掉,坏了就及时作废掉(C2).
- D1: 对于标记为已借出的对象,安检员定期检查时发现借出很久都未还,直接作废(D2)。
好了,故事讲完了,希望大家对Commons Pool都理解了。
有兴趣的同学可以继续往下看看我们遇到的那个问题:
我们使用Jedis作为redis客户端操作,在压测环境下,时不时发现Jedis报了这个异常:ClassCastException - [B cannot be cast to java.lang.Long
网上各种google百度,发现大部分网友们说是由于pipeline操作,出现异常时连接没有正确destory掉,而直接放回连接池里,被下个线程拿到后,取到连接中残留的pipeline的操作结果,从而导致类型转换错误。
这个解释听起来很在理,但反复检查代码,发现对于异常的封装都做好了,而且出现问题时也没有使用pipeline操作,应该不是网友们说的情况。
于是怀疑是不是连接池出了问题,多个线程对同一个连接做了不同的操作,获取错了数据导致,但大名鼎鼎的commons-pool出现这样低级的错误,不可能呀?
翻了几遍commons-pool的代码后,发现可能是上面说的那个定期检查的安检员捣的鬼?
对 于借出的对象,我们配置成借出后超过10秒不归还则作废,理论上对于redis的操作,10秒确实也足够了,但是我们对JedisPool做了进一步的封 装,在一些特殊情况下,确实会出现持有连接超过10秒的情况(这个就不展开了),导致连接还在被程序使用,读取redis的数据处理时,被清理线程无辜的 销毁了(调用jedis.quit()),
jedis的quit命令返回值就是一个Byte数组,而我们的操作返回是Long,于是就出现了ClassCastException - [B cannot be cast to java.lang.Long这样的异常。
最后的解决办法就是将作废时间的定义适当加大。
http://neway6655.github.io/redis/2015/12/19/%E5%96%84%E5%BE%85Redis%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE.html
Apache Commons Pool 故事一则 专题的更多相关文章
- Apache Commons Pool 故事一则
Apache Commons Pool 故事一则 最近工作中遇到一个由于对commons-pool的使用不当而引发的问题,习得正确的使用姿势后,写下这个简单的故事,帮助理解Apache Commons ...
- Tomcat 开发web项目报Illegal access: this web application instance has been stopped already. Could not load [org.apache.commons.pool.impl.CursorableLinkedList$Cursor]. 错误
开发Java web项目,在tomcat运行后报如下错误: Illegal access: this web application instance has been stopped already ...
- NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/pool/impl ...
- Spring + Tomcat 启动报错java.lang.ClassNotFoundException: org.apache.commons.pool.impl.GenericObjectPool
错误如下: -- ::,-[TS] INFO http-- org.springframework.beans.factory.support.DefaultListableBeanFactory - ...
- 池化 - Apache Commons Pool
对于那些创建耗时较长,或者资源占用较多的对象,比如网络连接,线程之类的资源,通常使用池化来管理这些对象,从而达到提高性能的目的.比如数据库连接池(c3p0, dbcp), java的线程池 Execu ...
- org/apache/commons/pool/impl/GenericObjectPool异常的解决办法
org/apache/commons/pool/impl/GenericObjectPool异常的解决办法 webwork+spring+hibernate框架的集成, 一启动Tomcat服务器就出了 ...
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- JedisCluster中应用的Apache Commons Pool对象池技术
对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分. apache common pool 官方文档可以参考:https://c ...
- Cache Lucene IndexReader with Apache Commons Pool
IndexReaderFactory.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...
随机推荐
- jquery-9 京东和酒仙网左侧导航如何实现
jquery-9 京东和酒仙网左侧导航如何实现 一.总结 一句话总结:布局的话多用定位,由底往上一层层的来布. 1.如何实现导航向div的平滑滑动? 右侧div和左侧的li一定要放在一起 127 &l ...
- 在Excel中粘贴时怎样跳过隐藏行
http://www.excel123.cn/Article/exceljichu/201203/932.html 有时在筛选后需要将其他区域中的连续行数据复制粘贴到筛选区域,以替换筛选后的数据.由于 ...
- 文件流结尾的EOF详解
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- pycharm highlight
https://www.jetbrains.com/help/pycharm/2017.1/highlighting-usages.html Highlighting usages in the cu ...
- 【u208】修复公路
Time Limit: 1 second Memory Limit: 128 MB [问题描述] A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数 ...
- HDU 3215 The first place of 2^n (数论-水题)
The first place of 2^n Problem Description LMY and YY are mathematics and number theory lovers. They ...
- Indy10 控件的使用(2)TidTCpServer组件学习
以下来自英文原版帮助文件,文桓英语不好,翻译了老半天.有错误的地方见谅,别骂我. TIdTCPServer = class(TIdComponent) Description TIdTCPServer ...
- js一些编写的函数
第一:它是最常见的 function A(){ } 说明 A(); 第二: var B = function(){ } 方法 B();//这是匿名函数 第三: (function () { ...
- hadoop 3.x 服役 | 退役数据节点
在服役前要配置好新增主机的环境变量,ssh等信息,个人环境介绍 hadoop002(namenode),hadoop003(resourcemanager),hadoop004(secondaryna ...
- 图解linux启动过程
概述 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUVZVUFOR0VO/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...