jedis returnResource(jedis)问题



  一坑未平,一坑又起,今天遇见了新的问题:jedisPool 的问题

        问题描述:分布式服务采用redis作为分布式锁实现,由于系统用java,所以就是用了jedis来实现redis链接对象,其中采用了jedispool作为连接池管理链接,

上线之后,前20分钟通过监控观察一切正常,通过内存所管理界面也可以正常观察锁的信息,但当上游系统开始高并发大批量进行服务调用之后,redis开始出现异常,

 大致为: classCastException:[B cann't cast long ........................    timeout等信息,,服务不得不回滚。


        通过对问题代码分析,可能是由于多线程在从redispool 里获取jedis资源的时候,由于获取的链接可能发生了异常,导致这个链接在returnResource时,没有被正确的回收,导致资源被耗尽,出现timeout的问题,同时,由于出现问题的链接,回收时,资源没有别初始化完全,导致在多线程的情况下,在同一个链接中(jedis对象)发生了数据共享的问题,这也就导致了出现类转换异常这样的错误。


      解决办法: 通过对returnResoure代码的分析发现,还有一个方法是专门处理这种链接情况的returnBrokeResoure,这两个方法要同时对jedis实例进行捕获异常情况与回收资源,当然也可以使用 close 来回收jedis资源。   

猜你喜欢

转载自blog.csdn.net/sunguojian111/article/details/78358069