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