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

转载于:https://www.cnblogs.com/softidea/p/5756646.html

Apache Commons Pool 故事一则 专题相关推荐

  1. Java_异常_03_ java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory

    异常信息: java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory 原因: 我用的是commons ...

  2. Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/BasePoolableObjectFactory

    摘要:异常信息解决过程记录 一:异常信息: Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/BasePoolabl ...

  3. Apache Commons Pool试用小记

    Apache Commons Pool小试一把 相比众多牛人的自己连接池,Apache的Pool就是牛中的大牛了,这里小试一把. 环境: commons-pool-1.5.3-bin.zip jdk1 ...

  4. Apache Commons工具集简介

    文章出处 Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils ...

  5. Apache Commons 工具类介绍及简单使用(转)

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  6. Apache Commons 工具类介绍及简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  7. 一篇关于apache commons类库的详解

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  8. java Apache Commons jar包简介

    一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...

  9. Apache Commons 工具集使用简介

    为什么80%的码农都做不了架构师?>>>    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍. ...

最新文章

  1. 企业名片小程序时代,打破纸质名片局限!
  2. 玩具租赁到底在解决用户什么痛点?
  3. Python线程、进程、进程池、协程
  4. tensorflow源码安装
  5. java 输入框_Java文本框和文本区的输入输出
  6. BI商业智能在企业中的重要性
  7. 14.凤凰架构:构建可靠的大型分布式系统 --- 资源与调度
  8. vue遍历Map集合
  9. 项目经理如何做好风险管理
  10. yum源的三种安装配置方式,总有一款适合你
  11. arduino 控制无刷电机_怎样使用Arduino控制无刷电机
  12. Ant design vue 表格合并 合并行 合并列
  13. 史上最最最没用程序——自写平衡化学方程式
  14. 更加精确的TCP Westwood拥塞控制算法
  15. 综合日语第一册第十二课
  16. 小野さん と ペット
  17. 复合型人才八种能力_我国一流大学人才培养目标的特点与问题
  18. 志愿者管理系统 php,志愿者信息管理系统
  19. windows中定时操作(SetTimer函数用法)
  20. 华中科技大学计算机与网络,华中科技大学计算机通信与网络实验报告-基于NS2的协议分析实验...

热门文章

  1. 魔改GPT自动写网文,速度一秒十字,还能给太监作品无限续更 | 开源
  2. 皮克斯技术指导辞职读博:研究AI设计怪物,从《游戏王》卡牌开始
  3. 全球首家!B站上线“杜比视界”给UP主用,“观众眼睛要被养刁了”
  4. 电子科大64年来首提Nature封面,邓旭团队为超疏水表面披上「铠甲」
  5. 能迂回,会绕路的开源游戏AI:解决怪物撞墙卡死角
  6. 波士顿动力双足机器人Atlas放出逆天体操表演,网友:比我还强
  7. 8篇论文梳理BERT相关模型进展与反思 | MSRA出品
  8. RocketMQ 4.5.1 双主双从异步复制环境搭建
  9. Squid配置二级代理(父代理)
  10. CCF NOI1063 计算组合数