Spring Data Redis を使用していますが、JedisPoolConfig
. RedisTemplate
次のように構成しました。
@Bean
JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
return jedisPoolConfig;
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig());
jedisConnectionFactory.setHostName(redisSettings.getServer().getHost());
jedisConnectionFactory.setPort(redisSettings.getServer().getPort());
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, Integer> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Integer> redisTemplate = new RedisTemplate<String, Integer>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setEnableTransactionSupport(true);
return redisTemplate;
}
としてマークされたサービスがあります。これは、Redis のキーの数をインクリメントする@Transactional
a を呼び出します。@Repository
@Service
@Transactional
public class MyService {
@Autowired
MyRepository myRepository;
public void recordStats() {
myRepository.recordStats();
}
}
@Repository
public class MyRepository {
@Resource(name="redisTemplate")
ValueOperations<String, Integer> valueOperations;
public void recordStats() {
valueOperations.increment("KEY01", 1);
valueOperations.increment("KEY02", 1);
valueOperations.increment("KEY03", 1);
valueOperations.increment("KEY04", 1);
valueOperations.increment("KEY05", 1);
valueOperations.increment("KEY06", 1);
valueOperations.increment("KEY07", 1);
valueOperations.increment("KEY08", 1);
valueOperations.increment("KEY09", 1);
valueOperations.increment("KEY10", 1);
valueOperations.increment("KEY11", 1);
}
}
デバッグでコードを呼び出しmyService.recordStats()
てステップ実行すると、KEY11 をインクリメントしようとするとハングし、最終的には で失敗しredis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
ます。JedisPoolConfig
MaxTotal を次のように増やすように修正すると、次のようになります。
@Bean
JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(128);
return jedisPoolConfig;
}
その後、問題は解決し、1 回のトランザクションで 11 個のキーすべてをインクリメントできます。すべてのvalueOperations.increment
呼び出しがプールから別の接続を取得しているようです。これは正しいですか、それともどこかに構成上の問題がありますか?