一个Redis Pool神奇的现象
来源:15-2 服务降级与服务熔断思路-2
![](http://img1.sycdn.imooc.com/user/5c66b50400013f3011111111-100-100.jpg)
高秋
2019-02-27
private ThreadLocal<Jedis> local = new ThreadLocal<Jedis>();
//这是我的getConnection方法
public Jedis getConn() {
Jedis jedis = local.get();
if (jedis == null) {
if (jedisPool == null) {
initPool();
}
jedis = jedisPool.getResource();
local.set(jedis);
}
return jedis;
}
//这是我的closeConn方法
public void closeConn() {
// 从线程本地获取redis连接对象
Jedis jedis = local.get();
if (jedis != null) {
System.out.println("不为空,关闭");
jedis.close();
}
local.set(null);
}
奇怪的是,我在线程里面调用了redisPoolUtil.closeConn();之后,调用jedis.set(“1”, “2”);仍然会成功,好像这里的closeConn并没有生效,希望老师坐下解答。一下是我的调用完整步骤
@Autowired
RedisPoolUtil redisPoolUtil;
@GetMapping("/simulateRedisKV")
public JSONObject simulateRedisManyKV() {
Jedis jedis = redisPoolUtil.getConn();
jedis.set("1", "2");
redisPoolUtil.closeConn();
// 依然会成功
jedis.set("2", "2");
return CommonUtil.successJson("Success");
}
写回答
1回答
-
Jimin
2019-02-27
你好,如果你closeconn方法里local.get方法返回空,就会执行不到实际的jedis.close方法了,主流程里的jedis和closeconn里的jedis我理解可能根本就不是一个实例。这个代码里threadlocal域的变量竟然不是static的,我感觉你上层的封装是有问题的,很可能是threadlocal用错了,你沿着这个思路去查一下吧。
022019-03-05
相似问题