我用jedis作为带有弹簧引导的红线连接。
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池租一个资源:
@Service
public class UserService {
@Autowired
private JedisPool jedisPool;
public User FindUserFromCache(Integer id){
Jedis resource = jedisPool.getResource()
// business logic
// resource.close()
}
}问题:
1.是否应该在业务逻辑结束时将资源返回到池中?spring引导或java运行时能够自动处理这种情况吗?
2.如果资源不关闭,那么资源就永远不会返回到池中?
发布于 2021-06-14 12:22:15
是否应该在业务逻辑结束时返回资源池?
是。
您也可以使用Java的试用资源特性。
try (Jedis resource = jedisPool.getResource()) {
// business logic
}可以自动处理这种情况吗?
JedisPool基于Apache项目,它既不是spring ( commons-pool2 )的一部分,也不是核心java的一部分。因此它们不能/不能自动地处理这种情况。
如果资源未关闭,那么资源将永远不会返回到池中?
准确地说,如果资源是而不是返回的,那么它就永远不会返回到池中。还有其他方法可以将资源返回到池中。但是close()应该是用户友好的方式。
发布于 2021-06-14 12:35:44
与其直接使用Jedis连接池,不如使用RedisTemplate.。
这样,您就不会为释放业务逻辑代码中的Jedis连接资源而烦恼。意味着更好的抽象。
此外,您将来也可以将驱动程序从"Jedis“更改为更新的”生菜“,而无需触及您的业务逻辑。
请参阅这里的更多内容:https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:template
https://stackoverflow.com/questions/67961348
复制相似问题