绝地武士池并没有像预期的那样工作。我已经提到了活动连接10,但它允许甚至超过10个连接。
我已重写redisconnectionfactory中的getconnection()方法。为了获得连接,这个方法已经被调用了将近30次。
我已经配置了绝地配置池,如下所述。有人能帮我解释一下为什么它创建的连接多于maxtotal吗?有人能帮我关闭绝地连接池吗。
@Configuration
public class RedisConfiguration {
@Bean
public RedisTenantDataFactory redisTenantDataFactory(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(1);
poolConfig.setMaxTotal(10);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setMaxWaitMillis(10);
JedisConnectionFactory jedisConnectionFactory = new
JedisConnectionFactory(poolConfig);
jedisConnectionFactory.setHostName(redisHost);
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPort(Integer.valueOf(redisPort));
}
#####
@Bean
public RedisTemplate<String, Object> redisTemplate(@Autowired RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.afterPropertiesSet();
return template;
}
}
我已重写redisconnectionfactory中的getconnection()方法。为了获得连接,这个方法已经被调用了将近30次。
1条答案
按热度按时间iaqfqrcu1#
这可能是对连接池行为的误解。我想,在没有关于如何在应用程序中使用池的详细信息的情况下。
因此,池的配置如下:
这意味着正如您所期望的,从这个特定池到redis的活动连接不会超过10个。
您可以使用redisinsight或命令client list检查redis本身的客户机数量(开放连接),您将看到来自这个jvm的连接不会超过10个。
事实上,你看到许多呼吁
getConnection()
只是因为应用程序每次需要连接时都在调用它。这并不意味着“打开一个新连接”,而是意味着“从池中给我一个连接”,您的配置定义了行为,如下所示:poolConfig.setMaxIdle(1)
=>您的应用程序将始终至少有一个连接打开并可用。选择一个好的数字很重要,因为“创建一个新的连接”需要时间和资源(1在正常应用中可能过低)poolConfig.setMaxTotal(10)
=>这意味着池在同一时间打开的连接不会超过10个。所以你必须定义当你达到10岁时会发生什么,而你的应用程序需要一个。这就是poolConfig.setBlockWhenExhausted(true)
=>这意味着如果应用程序已经使用了10个“活动”连接,那么应用程序调用getConnection()
,它将“阻塞”,直到10个连接中的一个返回到池。所以“封杀”可能不是个好主意(但这又取决于您的应用程序)
也许您想知道为什么您的应用程序调用getconnection()30次,为什么它不在10时停止/阻塞。。。。
因为你的代码很好;),我的意思是你的申请:
1-
Jedis jedis = pool.getCoonnection();
(因此需要一个来自池的活动连接)2-您正在使用jedis
按需连接3-关闭连接jedis.close()
(这不需要关闭真正的连接,它会返回到池的连接,池可以重用它或根据应用程序/配置关闭它)有道理吗?
通常您将使用以下代码
您可以在此处找到有关jedispool和apache commonpool的更多信息:
入门
apache公用池