testonborrow mysql_RedisPool的TestOnBorrow,TestOnReturn的坑

转载:https://blog.csdn.net/qq403580298/article/details/82937579

今天尝试Redis的分布式锁,因为没有分布式环境,使用多线程来代替,但是在使用多线程的时候,总是会有

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Socket closed或者

但是他们运行的特别慢,看了一下Runnable的线程,

可以发现线程卡在了SocketRead,name可以断定是Redis的问题,redis一直被卡住,所以才非常慢。

通过查阅论坛和搜索,可以知道是因为set函数被挂起了,导致最后set不成功。前辈的解释:

查看 Jedis 源码发现它的Connection中对网络输出流做了一个封装(RedisInputStream),其中自建了一个buffer。当发生异常的时候,这个buffer里还残存着上次没有发送或者发送不完整的命令。这个时候没有做处理,直接将该连接返回到连接池,那么重用该连接执行下次命令的时候,就会将上次没有发送的命令一起发送过去,所以才会出现上面的错误“返回值类型不对”。

而如果我们配置了TestOnBorrow或者TestOnReturn,就会检测这是不是一个活的jedis。但是高并发下就会很多失败,就没有一些所以会被一直卡住,无法从redis获得数据。(不知道解释的对不对)有知道答案的请告诉我。。。

那我们应该怎么办呢?

1. 最简单的办法就是为每一个线程建立一个jedis对象,并且lock或者release的的方法传入jedis。

2. 但是这样总是觉得很别扭,应为这是线程池的问题,因此,我们可以将TestOnBorrow或者TestOnReturn都设置为false,同时如果set或者release失败了,我们直接返回,就不等待了!

两种方法都可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值