一个Redis Pool神奇的现象

来源:15-2 服务降级与服务熔断思路-2

高秋

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用错了,你沿着这个思路去查一下吧。

0
2
Jimin
回复
高秋
这个问题你可以看一下jedis那个对象调用close方法前后内部属性的变化,如果没释放会有问题,操作不当会带来内存泄漏
2019-03-05
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程