Redis
 sql >> Database >  >> NoSQL >> Redis

Spring RedisConnectionFactory con la transazione che non restituisce la connessione al pool e quindi si blocca quando esaurita

Penso che il problema sia che chiamando exec() non dice al modello che hai effettivamente terminato la connessione, quindi non può essere restituito al pool.

Secondo i documenti dovresti avvolgere il tuo codice in un SessionCallback ed eseguilo con RedisTemplate.execute(SessionCallback<T> callback) che restituirà la connessione al pool dopo l'esecuzione della richiamata.

In questo modo:

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

Spring Data Redis supporta anche @Transactional che collegherà/scollegherà automaticamente la connessione per te, ma richiede di implementare il metodo in un bean che può essere intercettato (cioè non può essere final ) e le transazioni verranno avviate solo se eseguite dall'esterno del bean (ovvero non da un altro metodo nella stessa classe o da una classe sub/parent).

Stai già abilitando il supporto delle transazioni sul modello con redisTemplate.setEnableTransactionSupport(true); quindi dovresti essere a posto:

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