最近,测试同学在对一个我新写的接口进行单机压测时,前几秒可用率正常,但几秒后可用率便掉为了 0,现象甚是诡异。接口逻辑较为简单,仅仅是查询redis
然后将结果返回。最后发现一个规律,即正常的调用次数,和jedis
设置的最大连接数一致,超过最大连接数时,开始抛出无法获取jedis
链接的异常。
排查结果是:JedisPool
并不会主动释放连接,需要手动释放,因无法自动释放连接,导致随着请求的增加连接耗尽、抛出异常导致可用率下降。
为什么会出现这个原因呢?
因为在另外一个项目里,使用的是JedisPooled
,JedisPooled
是可以自动进行连接释放的,于是想当然的认为JedisPool
也会自动进行连接的释放。
当你从 JedisPool
中获取一个 Jedis
实例后,使用完成后需要手动将其返回到连接池中。这是通过调用 jedis.close()
方法来实现的。虽然 close()
方法并不真正关闭连接,而是将连接返回到池中以供后续使用。
edisPooled
是 Jedis 3.0 及以后的版本中引入的一个连接池实现,当你从 JedisPooled
中获取一个 Jedis
实例并使用完毕后,无需手动调用 close()
方法来释放连接。JedisPooled
会在使用结束后自动归还连接。