Мисля, че проблемът е в извикването на exec()
не казва на шаблона, че всъщност сте приключили с връзката, така че не може да бъде върнат в пула.
Според документите трябва да обвиете кода си в SessionCallback и го изпълнете с RedisTemplate.execute(SessionCallback<T> callback)
което ще върне връзката към пула, след като вашето обратно извикване се изпълни.
Като това:
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 също има поддръжка за @Transactional което ще обвърже/развърже връзката автоматично вместо вас, но изисква от вас да внедрите метода в бийн, който може да бъде прихванат (т.е. не може да бъде final
) и транзакциите ще бъдат стартирани само ако се изпълняват извън бина (т.е. не от друг метод в същия клас или под-/родителски клас).
Вече активирате поддръжката на транзакции в шаблона с redisTemplate.setEnableTransactionSupport(true);
така че трябва да сте готови:
@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);
}