springboot+redis 配置多个dbIndex 遇到Cannot get Jedis connection的问题


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import redis.clients.jedis.JedisPoolConfig;



@EnableCaching
@Configuration
public class RedisConfig {
    
    @Value("${redis.pool.max-wait}")
    private int redisPoolMaxWait;
    
    @Value("${redis.pool.max-idle}")
    private int redisPoolMaxIdle;
    
    @Value("${redis.pool.min-idle}")
    private int redisPoolMinIdle;
    
    @Value("${redis.dbindex13}")
    private int dbIndex13;
    
    @Value("${redis.dbindex14}")
    private int dbIndex14;

    @Value("${redis.host}")
    private String host;

    @Value("${redis.port}")
    private int port;

    @Value("${redis.password}")
    private String password;


    @Bean
    public JedisPoolConfig getJedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(redisPoolMaxIdle);
        jedisPoolConfig.setMinIdle(redisPoolMinIdle);
        jedisPoolConfig.setMaxWaitMillis(redisPoolMaxWait);
        return jedisPoolConfig;
    }
    
    @Bean(name = "cacheRedisTemplate13")
    public RedisTemplate getForeRedisTemplate(){

        JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
        connectionFactory.setPoolConfig(getJedisPoolConfig());
        connectionFactory.setDatabase(dbIndex13);	//此处配置database
        connectionFactory.setHostName(host);
        connectionFactory.setPassword(password);
        connectionFactory.setPort(port);
        connectionFactory.afterPropertiesSet();			//记得添加这行!

        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
        return stringRedisTemplate;
    }

    @Bean(name = "cacheRedisTemplate14")
    public RedisTemplate getRedisTemplateDb14(){

        JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
        connectionFactory.setPoolConfig(getJedisPoolConfig());
        connectionFactory.setDatabase(dbIndex14);
        connectionFactory.setHostName(host);
        connectionFactory.setPassword(password);
        connectionFactory.setPort(port);
        connectionFactory.afterPropertiesSet();

        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
        return stringRedisTemplate;
    }

}

如上,参考网上资料配置了两个redisTemplate

本地测试使用时,正常插入各自对应的dbIndex

当发布到测试环境(Linux)时,只有dbIndex13正常使用,另一个会报错

Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
 

并不清楚为何出现此问题,希望有谁能解答。

此后将配置多个dbIndex改为动态切换dbIndex

配置代码同上,只是删除了cacheRedisTemplate14的配置

同时,使用cacheRedisTemplate时

JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) cacheRedisTemplate.getConnectionFactory();
        jedisConnectionFactory.setDatabase(dbIndex13);



JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) cacheRedisTemplate.getConnectionFactory();
        jedisConnectionFactory.setDatabase(dbIndex14);

 

你可能感兴趣的:(工作学习)