【问题标题】:Should I always call close of jedis instance at the end of business logic?我应该总是在业务逻辑结束时调用绝地实例的关闭吗?
【发布时间】:2021-08-29 20:01:23
【问题描述】:

我使用 jedis 作为带有 spring boot 的 redis 连接。

jedis池配置如下:

@Configuration
@ConditionalOnClass(JedisPool.class)
@EnableConfigurationProperties(JedisProperties.class)
public class JedisAutoConfiguration {
    private JedisProperties jedisProperties;
    
    public JedisAutoConfiguration(JedisProperties jedisProperties) {
        this.jedisProperties = jedisProperties;
    }
    
    @Bean
    @ConditionalOnMissingBean(JedisPool.class)
    public JedisPool jedisPool() {
        
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(jedisProperties.getPool().getMaxIdle());
        poolConfig.setMaxTotal(jedisProperties.getPool().getMaxTotal());
        poolConfig.setMaxWaitMillis(jedisProperties.getPool().getMaxWaitMillis() * 1000);
        
        JedisPool jedisPool = new JedisPool(poolConfig, jedisProperties.getHost(), jedisProperties.getPort(),
                jedisProperties.getTimeout()*1000, jedisProperties.getPassword(), 0);
        return jedisPool;
    }
}

每次需要连接redis的时候,我都会从jedis pool中租一个资源:

@Service
public class UserService   {

    
    @Autowired
    private JedisPool jedisPool;


    public User FindUserFromCache(Integer id){
        Jedis resource  = jedisPool.getResource()
        // business logic

        // resource.close()
    }

}

问题:

1.我应该在业务逻辑结束时将资源返回到池中吗? spring boot 或者 java runtime 可以自动处理这种情况吗?

2.如果资源没有关闭,那么资源永远不会回到池中?

【问题讨论】:

    标签: java spring spring-boot jedis


    【解决方案1】:

    我应该在业务逻辑结束时将资源返回到池中吗?

    是的。

    您也可以使用 Java 的 try-with-resources 功能。

        try (Jedis resource  = jedisPool.getResource()) {
            // business logic
        }
    

    spring boot 或 java runtime 能否自动处理这种情况?

    JedisPool 基于 Apache commons-pool2 项目,该项目既不是 spring(引导)或核心 java 的一部分。所以这些不能/不能自动处理这种情况。

    如果资源没有关闭,那么资源将永远不会返回池中?

    准确地说,如果资源没有返回,那么它就永远不会返回到池中。还有其他方法可以将资源返回到池中。但是close() 应该是用户友好的方式。

    【讨论】:

      【解决方案2】:

      与其直接使用 Jedis 连接池,不如使用 RedisTemplate

      这样,您就不会为在业务逻辑代码中释放 Jedis 连接资源而烦恼。意味着更好的抽象。

      此外,您将来可以将驱动程序从“Jedis”更改为更新的“Lettuce”,而无需触及您的业务逻辑。

      在此处查看更多信息:https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:template

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 2011-06-01
        • 1970-01-01
        • 2011-06-28
        • 2011-05-01
        • 2019-07-20
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多