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