背景

近期,有用户反馈在使用系统的时候经常报错,具体后台报错信息如下图:

在这里插入图片描述
通过图中的报错信息,我们可以判断:应该是无法从池里获取连接了。

可是,一直都运行的好好的,怎么突然就不能获取连接了呢?

解决

首先,我们先排除掉「密码错误」的可能性。因为如果是密码错误的话,那从开始的时候就不可能正常运行的。

然后,考虑到本身业务场景不存在同一时刻产生大量并发子占满所有连接的情况,所以也排除掉了大并发造成等待超时的情况。

经查,服务重启后,该问题就消失了,但是运行一段儿时间后,问题又再度出现。由此猜测,是不是业务使用过的 redis 连接一直没有释放掉(即使业务完成了也没有释放掉!),致使池中的资源在系统运行一段时间后被耗尽,这样就导致了之后的业务请求无资源(redis连接)可用。

回头检查下 redis 连接池的相关配置,如下图:
在这里插入图片描述
啊哦!看我们发现了什么!enableTransactionSupport 为 true

这里引入一个知识点:

RedisTemplate 配置 enableTransactionSupport 为 true(开启事务)时,连接不会自动释放!!!!

之后,为了稳妥起见又回头确认了下相关业务代码是不是真的用到了 redis 事务,结果是并没有😅 。

果断将 enableTransactionSupport 设置为 false,或直接删除该配置,因为 enableTransactionSupport 默认为 false,如下图:

在这里插入图片描述
重启服务,运行一段时间后,问题没有再次出现过了~~ 😔

总结

此次问题产生的主要原因是,「开发Boy」直接从别的地方 copy 了一份 redis 的相关配置,但对于配置中的参数是不是适合当前这个项目,并没有很认真的检查过。

给我们的提示是:" copy 有风险,要留心检查 ",拿不准的配置项还是要 搞清楚了再用。否则,就是在给未来挖一个大

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐