Acho que o problema é que chamar
exec()
não informa ao modelo que você realmente concluiu a conexão, portanto, ela não pode ser retornada ao pool. De acordo com os documentos, você deve envolver seu código em um SessionCallback e execute-o com
RedisTemplate.execute(SessionCallback<T> callback)
que retornará a conexão com o pool após a execução do retorno de chamada. Assim:
template.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
aMap.put(A_KEY, a.toString(), a);
bMap.put(B_KEY, b.toString(), b);
cMap.put(C_KEY, c.toString(), c);
return operations.exec();
}
});
O Spring Data Redis também tem suporte para @Transactional que irá vincular/desvincular a conexão automaticamente para você, mas requer que você implemente o método em um bean que possa ser interceptado (ou seja, não pode ser
final
) e as transações só serão iniciadas se executadas de fora do bean (ou seja, não de outro método na mesma classe ou de uma classe sub/pai). Você já está habilitando o suporte a transações no modelo com
redisTemplate.setEnableTransactionSupport(true);
então você deve estar pronto para ir:@Transactional
public void put(A a, B b, C c) {
aMap.put(A_KEY, a.toString(), a);
bMap.put(B_KEY, b.toString(), b);
cMap.put(C_KEY, c.toString(), c);
}