spring-boot - 无法获取 Jedis 连接,嵌套异常 : Could not get a resource from the pool

标签 spring-boot jedis spring-data-redis spring-cache

我在尝试使用 Spring Boot 连接到 Redis 时遇到的一些问题需要一些帮助。

我正在使用以下 RedisConfiguration:

@Component
@Configuration
public class SpringRedisConf extends CachingConfigurerSupport {
    
    @Value("${spring.redis.host}")
    private String redisHostName;      
    
    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
        connectionFactory.setHostName("localhost");
        connectionFactory.setUsePool(true);
        connectionFactory.setPort(PortName);
        connectionFactory.getPoolConfig().setMaxTotal(10);
        connectionFactory.getPoolConfig().setMaxIdle(10);
        return connectionFactory;
    }
    
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        if (null == redisConnectionFactory) {
            LOG.error("Redis Template Service is not available");
            return null;
        }
    
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );
        template.setEnableTransactionSupport(true);
        return template;
    }

        
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        // Number of seconds before expiration. Defaults to unlimited (0)
        return cacheManager;
    }

我正在尝试创建单元测试来测试我的连接的以下类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserApp.class)
public class RedisConnectionTest {

@Autowired
    private RedisTemplate<String, Object> redisTemplate;

@Test
    public void testRedisConnection() {      
         redisTemplate.opsForValue().set("mouse", "loves cheese");
         assertThat( redisTemplate.opsForValue().get( "mouse").equals("loves cheese"));

    }
}

我知道有一个类似的问题here , 但我还没有达到评论所需的分数,我已经尝试了他们的建议,但我仍然得到相同的结果。 这是我的 pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${redis_clients_version}</version>
</dependency>

这是我的属性文件:

spring.data.redis.repositories.enabled=true
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=XXXX
spring.cache.redis.time-to-live=0ms
spring.cache.redis.cache-null-values=false

StackTrace 是这样的:

   redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
            at java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:589)
            at redis.clients.jedis.Connection.connect(Connection.java:184)



        

知道我做错了什么吗? 谢谢

最佳答案

您的端口号在属性和自配置的连接工厂之间配置错误。

我建议坚持使用一个或另一个 Spring Boot 的 RedisAutoconfiguration ,它引入 JedisConnectionConfiguration 会自动为你创建一个 ConnectionFactory属性。

https://github.com/spring-projects/spring-boot/blob/8f4bf233b4895a4fade5aff41e0a309f90ba3193/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java

spring.redis 属性驱动。

关于spring-boot - 无法获取 Jedis 连接,嵌套异常 : Could not get a resource from the pool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51405849/

相关文章:

redis - 有没有办法在jedis中传递redis命令,而不使用函数?

spring - 如何通过spring data redis连接多个redis实例?

spring - Jedis,无法获得 Jedis 连接 : cannot get resource from pool

java - 当没有定义请求对象时,如何使用 Spring Boot 发送 SOAP 请求

java - Spring 启动: MockMvc returning empty body for POST request

java - Spring Cloud微服务服务器端口强制转换异常

redis - 请求中的 CROSSLOT 键不散列到同一个插槽

java - 如何在抽象类中访问 TopologyContext

maven - 如何在 SpringBoot 应用程序测试上下文中使用来自测试 application.yml 的 spring 数据源设置的参数实例化 groovy.sql.Sql?

java - NotSslRecordException : not an SSL/TLS record