Myslím, že problém je ve volání exec()
neříká šabloně, že jste skutečně s připojením skončili, takže jej nelze vrátit do fondu.
Podle dokumentů byste měli kód zabalit do SessionCallback a spusťte jej pomocí RedisTemplate.execute(SessionCallback<T> callback)
která vrátí připojení k fondu po provedení zpětného volání.
Takhle:
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 má také podporu pro @Transactional který za vás automaticky sváže/odpojí připojení, ale vyžaduje, abyste implementovali metodu do beanu, který může být zachycen (tj. nemůže být final
) a transakce budou zahájeny pouze v případě, že budou provedeny mimo objekt bean (tj. ne z jiné metody ve stejné třídě nebo v podřízené/nadřazené třídě).
Podporu transakcí v šabloně již povolujete pomocí redisTemplate.setEnableTransactionSupport(true);
takže byste měli jít:
@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);
}