无法获取 Jedis 连接,嵌套异常:无法从池中获取资源
Cannot get Jedis connection, nested exception: Could not get a resource from the pool
我在尝试使用 spring 引导连接到 Redis 时遇到的一些问题需要一些帮助。
我正在使用以下 Redis 配置:
@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;
}
以及下面的 class 我正在尝试创建一个单元测试来测试我的连接:
@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"));
}
}
我知道有一个类似的问题,但我还没有达到评论所需的分数,我已经尝试了他们的建议,但我仍然得到相同的结果。
这是我的 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: 无法从池中获取资源
在 java.net.PlainSocketImpl.socketConnect(本机方法)
在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
在 java.net.Socket.connect(Socket.java:589)
在 redis.clients.jedis.Connection.connect(Connection.java:184)
知道我做错了什么吗?
谢谢
您的端口号在属性和自配置的连接工厂之间配置错误。
我建议坚持使用其中一个 Spring Boot 的 RedisAutoconfiguration
,它引入 JedisConnectionConfiguration
将根据属性自动为您创建一个 ConnectionFactory
。
由 spring.redis
属性驱动。
我在尝试使用 spring 引导连接到 Redis 时遇到的一些问题需要一些帮助。
我正在使用以下 Redis 配置:
@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;
}
以及下面的 class 我正在尝试创建一个单元测试来测试我的连接:
@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"));
}
}
我知道有一个类似的问题
<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: 无法从池中获取资源 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:589) 在 redis.clients.jedis.Connection.connect(Connection.java:184)
知道我做错了什么吗? 谢谢
您的端口号在属性和自配置的连接工厂之间配置错误。
我建议坚持使用其中一个 Spring Boot 的 RedisAutoconfiguration
,它引入 JedisConnectionConfiguration
将根据属性自动为您创建一个 ConnectionFactory
。
由 spring.redis
属性驱动。