sql >> Database >  >> NoSQL >> Redis

Spring RedisConnectionFactory met transactie die de verbinding met Pool niet teruggeeft en vervolgens blokkeert wanneer deze uitgeput is

Ik denk dat het probleem is dat het aanroepen van exec() vertelt de sjabloon niet dat u daadwerkelijk klaar bent met de verbinding, zodat deze niet kan worden teruggestuurd naar de pool.

Volgens de documenten moet u uw code in een SessionCallback plaatsen en voer het uit met RedisTemplate.execute(SessionCallback<T> callback) die de verbinding naar de pool zal herstellen nadat uw callback is uitgevoerd.

Zoals dit:

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 heeft ook ondersteuning voor @Transactional die de verbinding automatisch voor u zal binden/ontbinden, maar vereist dat u de methode implementeert in een boon die kan worden onderschept (d.w.z. het kan niet final zijn ) en transacties worden alleen gestart als ze van buiten de bean worden uitgevoerd (d.w.z. niet van een andere methode in dezelfde klasse of een sub-/ouderklasse).

U schakelt transactieondersteuning al in op de sjabloon met redisTemplate.setEnableTransactionSupport(true); dus je zou goed moeten zijn om te gaan:

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



  1. Time-outuitzondering na asynchrone opdrachten en Task.WhenAny wacht in StackExchange.Redis

  2. MongoDB $currentDate

  3. Redis pubsub berichtenwachtrij maar met terugbellen, zoals in ZeroMQ

  4. Upgraden van oudere mongo-database na onbedoelde upgrade van mongo-versie