Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Spring RedisConnectionFactory com transação não retornando conexão ao Pool e, em seguida, bloqueia quando esgotado


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);
}