版本声明
问题介绍
将配置了redis连接池的项目部署到服务器上构建docker镜像后启动容器,发现使用redis时一直报如下错误.
部分日志如下:
2020-03-17 08:56:47.345 [http-nio-6008-exec-1] ERROR c.z.e.common.handler.ResponseExceptionHandler - redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
redis.clients.util.Pool.getResource(Pool.java:53)
redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
com.zhaolaobao.ebankpay.common.redis.service.impl.RedisServiceImpl.domain(RedisServiceImpl.java:100)
com.zhaolaobao.ebankpay.common.redis.service.impl.RedisServiceImpl.getString(RedisServiceImpl.java:55)
com.zhaolaobao.ebankpay.qrpay.service.impl.QrPayServiceImpl.getQrPay(QrPayServiceImpl.java:89)
但是本地启动项目、打jar包本地java -jar运行、服务器上java -jar运行,都没问题;
项目jedisPool配置
源码 debug
查看一下位置(根据自己的配置类得到源码位置):
org.apache.commons.pool2.impl.GenericObjectPool#GenericObjectPool(org.apache.commons.pool2.PooledObjectFactory, org.apache.commons.pool2.impl.GenericObjectPoolConfig)
配置好远程debug后,在服务器启动项目时,也启动本地的remote连接,等待redis配置初始化,进入此断点时,查看factory:
此时可以排查自己的 hostAndPort 与 password 是否正确;
原因以及解决方案
密码后面的 “$q”丢了? 密码居然变了???
排查后发现,redis密码中有个“&”的特殊符号!!!
博主本想是通过docker-compose.yml配置环境变量注入的,后来才发现密码中的这个 $ 会导致从docker-compose.yml中取值时发送这样的问题;
那么docker-compose.yml中是否可以使用 ‘\$’ 来解决此问题呢?
然而 $符号以及后面的还是没了。
最后:
1、此密码还是老老实实的写在项目里把,不能通过环境变量注入了!!成功解决
2、或者修改密码后(不要带有‘$’ 这种特殊符号了),成解决