Jeg tror, problemet er at kalde exec()
fortæller ikke skabelonen, at du faktisk er færdig med forbindelsen, så den kan ikke returneres til poolen.
Ifølge dokumenterne skal du pakke din kode ind i et SessionCallback og kør det med RedisTemplate.execute(SessionCallback<T> callback)
som vil returnere forbindelsen til poolen efter dit tilbagekald er udført.
Sådan:
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 har også understøttelse af @Transactional som binder/afbinder forbindelsen automatisk for dig, men kræver, at du implementerer metoden i en bean, der kan opsnappes (dvs. den kan ikke være final
) og transaktioner vil kun blive startet, hvis de udføres uden for bean (dvs. ikke fra en anden metode i samme klasse eller en under-/overordnet klasse).
Du aktiverer allerede transaktionssupport på skabelonen med redisTemplate.setEnableTransactionSupport(true);
så du burde være god til at gå:
@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);
}