問題は、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();
}
});
SpringDataRedisは@Transactionalもサポートしています これにより、接続が自動的にバインド/アンバインドされますが、インターセプトできるBeanにメソッドを実装する必要があります(つまり、final
にすることはできません)。 )およびトランザクションは、Beanの外部から実行された場合にのみ開始されます(つまり、同じクラスまたはサブ/親クラスの別のメソッドからは実行されません)。
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);
}