Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法获取绝地连接,无法从池中获取资源_Java_Spring_Jedis_Spring Data Redis - Fatal编程技术网

Java 无法获取绝地连接,无法从池中获取资源

Java 无法获取绝地连接,无法从池中获取资源,java,spring,jedis,spring-data-redis,Java,Spring,Jedis,Spring Data Redis,我正在创建一个Web应用程序,并使用Redis进行数据存储。 我使用过Jedispool配置(redis客户端jedis版本2.9.0)。 因此,当我在Apache Jmeter的帮助下使用以下配置测试我的应用程序时: Number of threads(Users): 30 Ramp-Up period(in seconds) : 0 Loop-Count : 1 redis.sentinel.enable=true redis.sentinel.ip=localhost redis.sen

我正在创建一个Web应用程序,并使用Redis进行数据存储。 我使用过Jedispool配置(redis客户端jedis版本2.9.0)。 因此,当我在Apache Jmeter的帮助下使用以下配置测试我的应用程序时:

Number of threads(Users): 30
Ramp-Up period(in seconds) : 0
Loop-Count : 1
redis.sentinel.enable=true
redis.sentinel.ip=localhost
redis.sentinel.port=6379
redis.instance.account.masterName=master
redis.pool.max-active = 20
redis.pool.max-idle = 10
并使用以下配置进行配置:

Number of threads(Users): 30
Ramp-Up period(in seconds) : 0
Loop-Count : 1
redis.sentinel.enable=true
redis.sentinel.ip=localhost
redis.sentinel.port=6379
redis.instance.account.masterName=master
redis.pool.max-active = 20
redis.pool.max-idle = 10
使用以下代码(在Spring应用程序启动时创建为Bean):

此代码用于每次请求时获取新连接:

@Autowired
private JedisConnectionFactory redisConnectionFactory;
private StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
private RedisTemplate getNewConnection(){
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(stringRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
编辑:我对Redis的使用Redis中multi/exec的模板:

redisTemplate.setEnableTransactionSupport(true);

redisTemplate.multi();

for (ArrayList<Pair<String, String>> pairs : keys){
    for (Pair<String,String> pair: pairs)
        redisTemplate.opsForHash().get(makeMap(pair.getFirst(), version) , pair.getSecond());
}

return redisTemplate.exec();

我在网上搜索过,但没有找到解决办法。有人能帮我吗

使用Redis事务需要在回调中调用
setEnableTransactionSupport(true)
用于事务管理器/
@Transactional
使用。有关更多详细信息,请参阅

除非您有事务管理器,否则不要使用
setEnableTransactionSupport(true)

您的代码应该如下所示:

List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    operations.multi();
    operations.opsForSet().add("key", "value1");

    // This will contain the results of all ops in the transaction
    return operations.exec();
  }
});
List txResults=redisTemplate.execute(new SessionCallback()){
公共列表执行(RedisOperations)引发DataAccessException{
操作。多();
opsForSet().add(“key”,“value1”);
//这将包含事务中所有操作的结果
return operations.exec();
}
});

请发布应用程序中可用的完整堆栈跟踪。@mp911de,我已编辑了完整的异常。我还通过网络找到了此配置:jedisPoolConfig.getBlockWhenExhausted();此参数在deault中为true。但是,当所有连接都在使用时,配置似乎并没有真正阻止请求。有些地方不适合这里。您的
RedisTemplate
初始化代码未配置事务支持,但堆栈跟踪显示对
RedisConnectionUtils.bindConnection(…)
的调用,该调用仅在启用事务时使用(
RedisTemplate.setEnableTransactionSupport(…)
)。嘿,当我调用在函数中使用redistemplate时,我启用redistemplate.setEnableTransactionSupport(…)。我已经用代码更新了redisTemplate的用法。