ShardedJedisPool中,returnBrokenResource() 及 returnResource() ,为施放资源、关闭连接的方法,若重复调用,导致 _numActive 当前活动数一直递减,会出现负数的情况。

假如在一个方法中设置了三个jedis连接,在获取第一或第二个连接时出现异常,在抛出异常或者finally中总是施放这三个资源,会导致池中的连接连续施放三次,从而变成负数。

这样会出现连接池最大连接数配置无效的情况。

以下片段代码:

public class RedisUtil {public static ShardedJedisPool pool;static {JedisPoolConfig config = new JedisPoolConfig();// Jedis池配置config.setMaxActive(2);// 最大活动的对象个数config.setMaxIdle(1000 * 60);// 对象最大空闲时间config.setMaxWait(1000 * 3);// 获取对象时最大等待时间config.setTestOnBorrow(true);String hostA = "192.168.0.99";int portA = 6380;List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(1);JedisShardInfo infoA = new JedisShardInfo(hostA, portA);jdsInfoList.add(infoA);pool = new ShardedJedisPool(config, jdsInfoList);}public static void testRedis() {ShardedJedis jedis = null;ShardedJedis jedis1 = null;ShardedJedis jedis2 = null;try {// 从池中获取三次连接jedis = pool.getResource();jedis1 = pool.getResource();jedis2 = pool.getResource();String value = jedis.get("wuse");String value1 = jedis1.get("wuse");if (null == value || "".equals(value)) {jedis.set("wuse", "testWuse");jedis.expire("wuse", 20);}else {System.out.println(value);}} catch (Exception e) {e.printStackTrace();// 异常时关闭连接,此处可以注释} finally {pool.returnBrokenResource(jedis);pool.returnBrokenResource(jedis1);pool.returnBrokenResource(jedis2);}}
}

比如,设置的最大连接数为3,当第一次获取连接1和连接2的时候,没有问题,获取第三个连接的时候,由于最大连接数为2,所以抛异常

走finally之后,释放掉三个连接资源,这时候,pool连接池的当前活动数竟然为-1

所以,第二次再调用testRedis()方法时,由于之前pool的活动数为-1,这次三个连接都能获取成功,不抛异常。

-------------------------------------------------------------------------------

ShardedJedisPool类本身继承Pool类,Pool类中用了org.apache.commons.pool.impl.GenericObjectPool类来当做连接池,而Pool类初始化时,需要传入PoolableObjectFactory工厂类,在ShardedJedisPool类中自定义了一个继承BasePoolableObjectFactory类的工厂类ShardedJedisFactory,而ShardedJedisFactory类中的销毁方法destroyObject()方法中,从传进来的ShardedJedis对象里获取了镜像连接,继承的最顶层Sharded类中的getAllShards()方法,实际上只是通过Collections工具类获取了resources的value集合的镜像,所以实际上也就是说只是意义上释放了连接。 

而ShardedJedisPool类中的returnBrokenResource()方法,实际上调用的是GenericObjectPool类的invalidateObject()方法,而每次调用后,总会再去做 _numActive --,也就是说,每次调用,当前活动数都会减1,有可能最终导致负数(其实是与实际活动数不匹配),从而影响到原始设定的最大连接数会不管用。

转载于:https://www.cnblogs.com/anranwuse/p/3698052.html

ShardedJedisPool 中可用连接数的小bug相关推荐

  1. windows中的一个小bug

    无意中发现的windows的一个小bug,同时按下"ctrl"键和"alt"键时,过一秒钟左右cpu占用就会达到100%,在两台机器试验了一下都这样.因为也不是 ...

  2. xlnx4.0中关于SPI-nor-flash的一个小bug

    最经搞关于zynq7000,用到了petalinux,其中用的内核版本为xlnx4.0.再处理nandflash问题是,发现如下问题,阅读关于与扩展地址操作的原代码,从纸面上看应该属于一个小bug.原 ...

  3. [DiscuzNt]整合DiscuzNt论坛目前所发现的小BUG及个人简单解决办法

    前段时间因为公司项目需要,需要在网站中整合BBS论坛,主要实现会员信息同步,经过目前市面上开源的BBS项目,最终认为还是DiscuzNt比较好,原因有以下几点: 1.符合国人习惯,DiscuzNt是由 ...

  4. 在Qt Designer中使用自定义Widgets小部件

    在Qt Designer中使用自定义Widgets 在Qt Designer中使用自定义Widgets 处理自定义Widgets小部件 推广Widgets小部件 用户定义的自定义小部件 在Qt Des ...

  5. PHP引用全局作用域中可用的全部变量是,php全局变量之学习笔记

    今天我们参考php官方对php全局变量介绍来理解一下php全局变量一些用法与自己对它的一些思考吧,现在分享出来希望对各位同学有帮助. 一.核心要点思考: 1. 哪些全局变量是过期的及如何处理? 如:u ...

  6. linux的内核有多小,Linux 内核有小bug?

    今天读着读着Linux代码,竟然无意中发现Linux 0.11内核有个小bug,呵呵,人非圣贤孰能无过. // 在目录项数据块中搜索匹配指定文件名的目录项,首先让de 指向数据块,并在不超过目录中目录 ...

  7. java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?

    [Java教程]十个JavaScript中易犯的小错误,你中了几枪? 0 2015-06-01 12:00:19 序言 在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见 ...

  8. shell中的括号(小括号,中括号,大括号/花括号)

    一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  9. shell中的括号(小括号,中括号,大括号)

    一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

最新文章

  1. sql serve存储过程
  2. 一个完整的Core Data应用
  3. d3.js 旋转图形_几何画板第9期图形的组合型运动
  4. java converter转换器_springboot 自定义转换器(converter)
  5. memcpy和memmove的区别
  6. Spring MVC 启动
  7. grid赋予oracle磁盘权限,grid 与 Oracle 用户下 Oracle 程序权限不一致导致无法连接 ASM 问题...
  8. elasticsearch及Kibana入门安装
  9. Wrong FS: hdfs://......, expected: file:///
  10. 怎么对视频进行简单补帧
  11. Projector学习笔记
  12. 学术-几何-维:超级立方体 (五维超级超立方体)
  13. 重庆邮电大学计算机学硕考研经验,重庆邮电大学计算机考研复试备考经验及经过...
  14. 《秘密》-- 东野圭吾
  15. ChatGPT 免费体验来了
  16. centos上启动mysql_centos下怎么启动mysql
  17. Linux内核--链表结构
  18. 给兄弟的毕业工作定居指导
  19. 极光推送集成厂商通道(java)
  20. QCC3040---蓝牙名称修改

热门文章

  1. 算法之排序算法-选择排序与优化
  2. tensorflow的keras 与 原生keras几点比较
  3. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析
  4. UVA455 - Periodic Strings
  5. ActiveMQ入门实例
  6. php操作带中文的json数据
  7. Docker中安装Jenkins实时发布.net core 项目(二)
  8. springboot多环境加载yml和logback配置
  9. Android 扫描二维码demo
  10. /lib/libcrypto.so“ not found,is 32-bit instead of 64-bit