Redis
 sql >> Base de données >  >> NoSQL >> Redis

Spring RedisConnectionFactory avec la transaction ne renvoyant pas la connexion au pool, puis se bloque lorsqu'elle est épuisée

Je pense que le problème est que l'appel de exec() n'indique pas au modèle que vous en avez réellement terminé avec la connexion, il ne peut donc pas être renvoyé au pool.

Selon la documentation, vous êtes censé envelopper votre code dans un SessionCallback et exécutez-le avec RedisTemplate.execute(SessionCallback<T> callback) qui renverra la connexion au pool après l'exécution de votre rappel.

Comme ceci :

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 prend également en charge @Transactional qui liera/dissociera automatiquement la connexion pour vous, mais vous obligera à implémenter la méthode dans un bean qui peut être intercepté (c'est-à-dire qu'il ne peut pas être final ) et les transactions ne seront lancées que si elles sont exécutées depuis l'extérieur du bean (c'est-à-dire pas depuis une autre méthode de la même classe ou une classe sous-/parente).

Vous activez déjà la prise en charge des transactions sur le modèle avec redisTemplate.setEnableTransactionSupport(true); donc vous devriez être prêt à partir :

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