Myślę, że problem polega na tym, że wywołanie exec()
nie informuje szablonu, że połączenie zostało zakończone, więc nie może zostać zwrócone do puli.
Zgodnie z dokumentacją powinieneś umieścić swój kod w SessionCallback i wykonaj go za pomocą funkcji RedisTemplate.execute(SessionCallback<T> callback)
który zwróci połączenie do puli po wykonaniu wywołania zwrotnego.
Tak:
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 obsługuje również @Transactional który automatycznie zwiąże/rozwiąże połączenie, ale wymaga zaimplementowania metody w bean, który może zostać przechwycony (tzn. nie może być final
).
Włączasz już obsługę transakcji w szablonie za pomocą redisTemplate.setEnableTransactionSupport(true);
więc powinieneś być gotowy:
@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);
}